
interface UserInterface {
    id?: number;
    accountId: number;
    username: string;
    email: string;
    password: string;
    countryCode: string;
    mobile: string;
    status: number;
    onlineStatus: number;
    google?: string;
    apple?: string;
    facebook?: string;
    userProfile?: UserProfileInterface;
    sameOnWhatsapp?: boolean;
}

interface UserProfileInterface {
    id?: number;
    userId?: number;
    referralCode: string | null;
    referralPoints: number | null;
    redeemedReferralPoints: number | null;
    promptionalPoints: number | null;
    redeemedPromptionalPoints: number | null;
    firstName?: string | null;
    lastName?: string | null;
    name: string;
    rankId?: number | null;
    shipTypeId?: number | null;
    profileImageId?: number | null;
    birthYear: number | null;
    lastCommencingDate?: Date;
    menstruationCycle?: number;
    menstruationDuration?: number;
    dob?: Date;
    gender?: string;
    fitnessLevel?: string;
    accuracy?: number;
    obesity?: number;
    diabetic?: number;
    sessionCount?: number;
    presentRankSince?: Date | null;
    presentCompany?: string | null;
    presentCompanySince?: Date | null;
    aboutMe?: string | null;
    areaOfExpertise?: any | null;
    nationality?: string | null;
    followersCount?: number;
    followingCount?: number;
    socialMediaLinks?: SocialMediaLinkInterface[] | null;
    userType?: string | null;
    questionCount?: number;
    answerCount?: number;
    answerCommentCount?: number;
    postCommentCount?: number;
    seaQALikesCount?: number;
    seaQABookmarksCount?: number;
}

interface SocialMediaLinkInterface {
    platform: string;
    url: string;
}

interface UserFollowerInterface {
    id?: number;
    followerId: number;
    followingId: number;
}

interface UserReferralInterface {
    id?: number;
    userId?: number;
    referrerId: number;
    points: number;
    status: number;
}

interface UserAccountInterface {
    id?: number;
    userId?: number;
    accountId: number | null;
    isDefault: boolean;
}

interface UserSettingInterface {
    id?: number;
    userId?: number;
    twoFactorAuthentication?: Boolean;
    temporaryPassword?: Boolean;
    notificationCount?: number;
    selectedTheme?: number;
    profileQuestionnaireCompleted?: Boolean;
    profileDetailedQuestionnaireCompleted?: Boolean;
    interestSelected?: Boolean;
    isPremium?: Boolean;
    securityDeclaration?: Boolean;
}

interface UserRoleInterface {
    userId?: number;
    accountId: number | null;
    roleId: number
}

interface UserScheduleInterface {
    userId?: number;
    scheduleId: number
}

interface UserScheduleDataRequest {
    userId: number | null;
    scheduleId: number
}

interface UserDeviceInterface {
    id?: number;
    userId?: number;
    accountId?: number | null;
    deviceType: string | null,
    device: string;
    status: number;
}

interface AuthCredentials {
    userId: number;
    accountId: number | null;
    name: string;
    birthYear: number | null;
    email: string;
    countryCode: string;
    mobile: string;
    username: string;
    type: string;
    userRoles: userRoleObject[]
    permissions: string[]
}

interface UserPublicObjectInterface {
    id: number;
    name: string;
    profileImage: string;
    aboutMe?: string | null;
    socialMediaLinks?: SocialMediaLinkInterface[] | null;
    isFollowed?: boolean;
    rank?: {
        id: number;
        name: string;
        category?: string | null;
    } | null;
}

interface SignUpEmailObject {
    email?: string | null;
    mobile?: string | null;
    countryCode?: string | null;
    username?: string | null;
    password: string | null;
    name: string | null;
    firstName?: string | null;
    lastName?: string | null;
    rankId?: number | null;
    referralCode: string | null;
    accountId?: number | null;
    userId?: number | null;
    accountKey?: number | null;
    roles?: string[] | null;
    socialMediaLinks?: SocialMediaLinkInterface[] | null;
    aboutMe?: string | null;
    profileImageId?: number | null;
    nationality?: string | null;
}

interface socialLoginRequest {
    provider: string;
    accessToken: string;
    email?: string;
    name: string;
    phone?: string;
    referralCode: string | null;
    accountId?: number | null;
    accountKey?: number | null
}

interface SignupData {
    id?: number;
    email?: string | null;
    username?: string | null;
    countryCode?: string | null;
    referralCode: string | null;
    mobile?: string | null;
    password?: string | null;
    name: string | null;
    firstName?: string | null;
    lastName?: string | null;
    rankId?: number | null;
    shipTypeId?: number | null;
    accountId?: number | null;
    accountKey?: number | null;
    presentRankSince?: Date | null;
    presentCompany?: string | null;
    presentCompanySince?: Date | null;
    aboutMe?: string | null;
    areaOfExpertise?: any | null;
    nationality?: string | null;
    dob?: Date | string | null;
    followersCount?: number;
    followingCount?: number;
    userType?: string | null;
    socialMediaLinks?: SocialMediaLinkInterface[] | null;
    profileImageId?: number | null;
}

interface ForgotPasswordObject {
    email: string;
}

interface ForgotPasswordResponseObject {
    resetPasswordToken: Text;
}

interface ResetPasswordObject {
    resetPasswordToken: Text;
    verificationCode: string;
    password: string;
}

interface resetPasswordRequest {
    email: string;
}

interface ChangePasswordRequest {
    password: string;
}

interface UserSummaryObjectInteface {
    id: number;
    email?: string | null;
    username?: string | null;
    countryCode?: string | null;
    mobile?: string | null;
    name: string;
    birthYear: number | null;
    createdAt: Date;
    updatedAt: Date;
}

interface UserPaginatioinListRequestObject {
    page: number;
    perPage: number;
    searchText: string | null;
    sortBy: string;
    sortDirection: string;
    deviceType?: string | null;
    roleId?: number | number[] | null;
    userIds?: number[] | null;
    staffOnly?: boolean | null;
    status?: number | null;
    higherOrEqualRank?: boolean | null;
    isPremium?: boolean | null;
}

interface UserPaginatedList {
    page: number;
    perPage: number;
    totalRecords: number;
    totalPages?: number;
    data: CategorySummaryObjectInteface[] | [];
}

interface UserPaginatedData {
    totalRecords: number;
    data: any[] | [];
    page?: number;
    perPage?: number;
    totalPages?: number;
}

interface userRoleObject {
    id: number;
    code: string;
    name: string;
    rolePermissions: { code: string }[];
}

interface userRolesObject {
    id: number;
    userRoles: userRoleObject[];
}

interface SignupToken {
    signUpToken: Text | null;
}

interface token {
    token: Text;
}

interface resendToken {
    mobileLoginToken: Text | null;
    signUpToken: Text | null;
    changeEmailToken: Text | null;
    changeMobileToken: Text | null;
    forgotPasswordToken: Text | null;
    onCall: boolean;
}

interface verifyEmailRequest {
    signUpToken: Text | null;
    changeEmailToken: Text | null;
    forgotPasswordToken: Text | null;
    code: string;
    type?: string;
}
interface verifyMobileRequest {
    mobileLoginToken: ?Text | null;
    changeMobileToken: ?Text | null;
    deleteAccountToken: ?Text | null;
    code: string;
    type?: string;
}

interface loginRequest {
    email: string | null;
    username: string | null;
    countryCode: string | null;
    mobile: string | null;
    password: string;
}

interface LogoutRequest {
    removeAll: boolean;
}

interface UserExportRequestObject {
    searchText: string | null;
    sortBy: string;
    sortDirection: string;
    roleId?: number | number[] | null;
    status?: number | null;
    deviceType?: string | null;
}

interface TokenFromRefreshTokenRequest {
    refreshToken: Text;
}

interface RefTokenResponse {
    userId: number;
    accountId: number | null;
    token: Text;
    refreshToken: Text
}

interface MenstruationData {
    lastCommencingDate: Date | null;
    menstruationCycle: number | null;
    menstruationDuration: number | null;
}

interface UserDeviceInterface {
    id?: number;
    userId?: number;
    accountId?: number;
    deviceType: string;
    device: string;
    status: number;
}

interface UserDeviceRequest {
    deviceType: string;
    device: string;
}

interface changeEmailRequest {
    email: string;
    accountKey?: string;
}

interface changeMobileRequest {
    countryCode: string;
    mobile: string;
    accountKey?: string;
}

interface mobileLoginRequest {
    countryCode: string;
    mobile: string;
    name: string;
    accountKey?: string;
}

interface UpdateUserProfileRequest {
    profileImageId?: number | null;
    name?: string;
    dob?: Date | null;
    rankId?: number | null;
    presentRankSince?: Date | string | null;
    presentCompany?: string | null;
    presentCompanySince?: Date | string | null;
    aboutMe?: string | null;
    areaOfExpertise?: any;
    socialMediaLinks?: any;
    userType?: string | null;
    nationality?: string | null;
}

interface UpdateUserStatusRequest {
    status: number;
}

interface UserFlowQueryObject {
    detailed: boolean | string;
}

interface UserFlowStepObject {
    step: string;
    method: string;
    endpoint: string;
    statusCode: number;
    success: boolean;
    responseMessage: string | null;
    errorMessage: string | null;
    payload?: unknown;
    response?: unknown;
}

interface DaoOptions {
    transaction?: import("sequelize").Transaction;
}

interface UserCreateNewAccountServiceInput {
    signupData: SignUpEmailObject;
    createUser?: boolean;
}

interface UserCreateServiceInput {
    signupData: SignUpEmailObject;
    createUser?: boolean;
}

interface UserSetPasswordServiceInput {
    userId: number;
    password: string;
}

interface UserUpdateUserDetailsServiceInput {
    id: number;
    signupData: SignUpEmailObject;
}

interface UserDeleteServiceInput {
    userId: number;
    countryCode: string;
    mobile: string;
}

interface UserRegisterUserDeviceServiceInput {
    deviceType: string;
    device: string;
}

interface UserUpdateReferralCodeServiceInput {
    userId: number;
    referralCode: string;
}

interface UserApplyReferralServiceInput {
    referralCode: string;
}

interface UserCreateDaoInput {
    userInfo: SignupData;
    roles: number[];
}

interface UserSetPasswordDaoInput {
    userId: number;
    password: string;
}

interface UserUpdateUserDetailsDaoInput {
    id: number;
    userInfo: SignupData;
    roles: number[];
}

interface UserDeleteDaoInput {
    userId: number;
    countryCode: string;
    mobile: string;
}

interface UserUpdateUserProfileFieldsDaoInput {
    fields: { [key: string]: string | number | boolean | Date };
}

interface UserUpdateReferralCodeDaoInput {
    userId: number;
    referralCode: string;
}

interface UserRegisterUserDeviceDaoInput {
    userId: number;
    accountId: number | null;
    deviceType: string;
    device: string;
}

interface UserApplyReferralDaoInput {
    userId: number;
    referralCode: string;
}

interface UserMenstruationDetailInterface {
    id?: number;
    userId?: number;
    accountId?: number;
    lastCommencingDate: Date;
    menstruationCycle: number;
    menstruationDuration: number;
    status: number;
}
