export interface GigyaSdkStateType {
  apiKey: string
  UID: string
  lang: string
  error?: GigyaSdkErrorType
  storageKey: string
  storage?: {
    getItem: (key: string) => string | null | Promise<string | null>
    setItem: (key: string, value: string) => any
  }
  authenticationAttempt?: {
    type?: 'apple' | 'email' | 'facebook'
  }
  regToken?: {
    value?: GigyaSdkLoginErrorPayloadType['regToken']
    expirationDate?: Date
    isStillValid?: boolean
  }
}

export enum GigyaSdkErrorCodes {
  ConsecutiveRequestLimitReached = 400125,
  AccountTemporarilyLockedOut = 403120,
  InvalidLoginIdOrPassword = 403042,
  MaxRequestLimitReached = 403000,
  NotConnectedToNetwork = 400106,
  InvalidApiKeyParameter = 400093,
  UniqueIdentifierExists = 400003,
  PendingVerification = 206002,
  LoginIdDoesNotExist = 403047,
  PendingRegistration = 206001,
  ConflictingAccount = 403043,
  PermissionDenied = 403007,
  InvalidParameter = 400006,
  ValidationError = 400009,
}

export enum GigyaSdkErrors {
  ConsecutiveRequestLimitReached = 'consecutiveRequestLimitReached',
  AccountTemporarilyLockedOut = 'accountTemporarilyLockedOut',
  InvalidLoginIdOrPassword = 'invalidLoginIdOrPassword',
  CreateURLRequestFailed = 'createURLRequestFailed',
  MaxRequestLimitReached = 'maxRequestLimitReached',
  NotConnectedToNetwork = 'notConnectedToNetwork',
  InvalidApiKeyParameter = 'invalidApiKeyParameter',
  UniqueIdentifierExists = 'uniqueIdentifierExists',
  PendingPasswordChange = 'pendingPasswordChange',
  LoginIdDoesNotExist = 'loginIdDoesNotExist',
  PendingRegistration = 'pendingRegistration',
  PendingVerification = 'pendingVerification',
  ConflictingAccount = 'conflictingAccount',
  InvalidParameter = 'invalidParameter',
  PermissionDenied = 'permissionDenied',
  ValidationError = 'validationError',
  SetAccountError = 'setAccountError',
  UndefinedError = 'undefinedError',
  JsonParseError = 'jsonParseError',
  EmptyResponse = 'emptyResponse',
  UserCancelled = 'userCancelled',
  NetworkError = 'networkError',
  SendApiError = 'sendApiError',
}

export interface GigyaSdkApiResponseType {
  statusReason: string
  statusCode: number
  errorCode: number
  callId: string
  time: Date
}

export interface GigyaSdkValidationErrorType {
  errorCode: number
  fieldName:
    | 'username'
    | 'password'
    | 'secretQuestion'
    | 'secretAnswer'
    | 'email'
  message: string
}

export interface GigyaSdkLoginErrorPayloadAccountInfoType
  extends GigyaSdkApiResponseType {
  UID: string
  UIDSig: string
  UIDSignature: string
  signatureTimestamp: string
  isSiteUser: boolean
  isConnected: boolean
  isTempUser: boolean
  isLoggedIn: boolean
  loginProvider: string
  loginProviderUID: string
  isSiteUID: boolean
  identities: Record<string, unknown>[]
  nickname: string
  photoURL: string
  thumbnailURL: string
  firstName: string
  lastName: string
  gender: string
  email: string
  capabilities: string
  providers: string
  oldestDataUpdatedTimestamp: number
  oldestDataAge: number
  timestamp: string
}

export interface GigyaSdkLoginErrorPayloadType extends GigyaSdkApiResponseType {
  errorCode: GigyaSdkErrorCodes
  errorDetails: string
  errorMessage: string
  apiVersion: number
  newUser: boolean
  accountInfo: GigyaSdkLoginErrorPayloadAccountInfoType
  id_token: string
  regToken: string
  loginID?: string
  loginProviders?: ('apple' | 'facebook' | 'site')[]
  validationErrors?: GigyaSdkValidationErrorType[]
}

export interface GigyaSdkErrorType {
  payload: GigyaSdkLoginErrorPayloadType | null
  type: GigyaSdkErrors
  code?: string
  name?: string
  message?: string
  stack?: string
}

export interface GigyaConsentSchemaType {
  key: string
  format: string
  writeAccess: string
  legalStatements: Record<string, { documentUrl: string; purpose: string }>
  customData: unknown[]
  minDocVersion: number
  currentDocVersion: number
  type: string
  required: boolean
}

export interface GigyaSdkProfileType {
  firstName: string
  lastName: string
  email: string
  nickName?: string
  address?: string
  age?: number
  bio?: string
  birthDay?: number
  birthMonth?: number
  birthYear?: number
  capabilities?: string
  certifications?: unknown
  city?: string
  country?: string
  education?: unknown
  educationLevel?: string
  favorites?: unknown
  followersCount?: number
  followingCount?: number
  gender?: string
  hometown?: string
  honors?: string
  identities?: unknown
  industry?: string
  interestedIn?: string
  interests?: string
  isConnected?: boolean
  iRank?: number
  isSiteUID?: boolean
  isSiteUser?: boolean
  languages?: string
  likes?: unknown
  locale?: string
  name?: string
  oldestDataAge?: number
  oldestDataUpdatedTimestamp?: number
  patents?: unknown
  phones?: unknown
  photoURL?: string
  providers?: string
  publications?: unknown
  relationshipStatus?: string
  religion?: string
  samlData?: unknown
  skills?: unknown
  specialities?: string
  state?: string
  timezone?: string
  thumbnailURL?: string
  username?: string
  isVerified?: boolean
  verified?: string
  verifiedTimestamp?: number
  work?: unknown
  zip?: string
}

export interface GigyaSdkLoginType {
  loginProvider: 'apple' | 'facebook' | 'site'
  lastLogin: Date
  profile: GigyaSdkProfileType
  lastUpdatedTimestamp: number
  registeredTimestamp: number
  socialProviders: string
  lastLoginTimestamp: number
  isActive: boolean
  isVerified: boolean
  UID: string
  registered: string
  UIDSignature: string
  verified: Date
  oldestDataUpdated: Date
  signatureTimestamp: string
  oldestDataUpdatedTimestamp: number
  apiVersion: number
  lastUpdated: Date
  verifiedTimestamp: number
  isRegistered: boolean
  createdTimestamp: number
  created: Date
}

export interface GigyaSdkAccountInfoType extends GigyaSdkLoginType {
  lastLoginLocation?: {
    country: string
    coordinates: { lat: number; lon: number }
  }
  preferences?: unknown
  data?: unknown
  identities: Record<string, unknown>[]
  subscriptions?: unknown
  emails?: { verified: string[]; unverified: string[] }
  loginIDs?: { username: string; emails: string[]; unverifiedEmails: string[] }
  isLockedOut?: boolean
  id_token?: string
}

export interface GigyaSdkRegisteredAccountType extends GigyaSdkAccountInfoType {
  sessionInfo: {
    sessionToken: string
    sessionSecret: string
  }
}

export interface GigyaSdkConflictingAccountType {
  loginID: string
  loginProviders: ('apple' | 'facebook' | 'site')[]
}
