declare module 'teko-oauth2' {
  export interface InitOptions {
    clientId: string
    oauthDomain?: string
    redirectUri?: string
    postLogoutRedirectUri?: string
    scopes?: string[]
    monitorSession?: boolean
    silent?: boolean
    checkTokenRevoked?: boolean
    bffDomain?: string
    isCacheFullUserInfo?: boolean
  }

  export interface IUser {
    accessToken: string
    expiresAt: number
    expiresIn: number
    idToken: string
    profile: IUserInfo
    scopes: string[]
    sessionState: string
    tokenType: string
  }

  export interface IUserInfo {
    sub: string
    name: string
    picture: string
    updated_at: string

    email: string
    phone_number: string
    birthday: string
    address: string

    tenant_id: string
  }

  export interface CheckUserHasRolesAndPerms {
    hasPermissions: boolean
    hasRoles: boolean
  }

  export interface IUserDetailsInfo extends IUserInfo {
    roles: string[]
    permissions: string[]
    meta_data: any
  }

  export interface IUserManager {
    isLoggedIn: () => boolean
    login: (redirectUri?: string, additionalParams?: any) => void
    loginSilent: () => Promise<IUser>
    renewTokenUsingRefreshToken: () => Promise<IUser>
    logout: (redirectUri?: string, additionalParams?: any) => void
    loadUser: () => IUser | undefined
    unloadUser: () => void
    events: any
    getUserInfo: () => IUserInfo
    getFullUserInfo: (adminDomain?: string) => Promise<IUserDetailsInfo>
    getFullUserInfoWithCache: () => Promise<IUserDetailsInfo | undefined>
    getUserScopes: () => string[]
    getAccessToken: () => string
    getAccessTokenExpiredAt: () => number
    hasRoles: () => CheckUserHasRolesAndPerms
    hasRole:() => CheckUserHasRolesAndPerms
    hasPermission:() => CheckUserHasRolesAndPerms
  }

  const TekoID: {
    user: IUserManager
    version: string
    init: (options: InitOptions) => Promise<void>
  }
  export default TekoID
}
