export {};

declare global {
  const Aura: AuraSdk;

  interface Window {
    Aura: AuraSdk;
  }
}

export type AuraTheme = "light" | "dark" | "system" | string;

export interface AuraConfigOptions {
  apiBaseUrl?: string;
  auraOrigin?: string;
  clientId?: string;
  client_id?: string;
  mode?: AuraTheme;
  origin?: string;
  readToken?: string;
  read_token?: string;
  theme?: AuraTheme;
}

export interface AuraConfig {
  apiBaseUrl: string;
  auraOrigin: string;
  clientId: string;
  readToken: string;
  theme: string;
}

export interface AuraUser {
  _id?: string;
  address?: string | null;
  addresses?: string[];
  avatar?: string | null;
  bio?: string | null;
  discordConnected?: boolean;
  discordGlobalName?: string | null;
  discordId?: string | null;
  discordUsername?: string | null;
  displayName?: string | null;
  email?: string | null;
  followers?: number;
  following?: number;
  id?: string;
  isFollowing?: boolean;
  isSelf?: boolean;
  username?: string | null;
  verifiedExternalAddresses?: string[];
  xConnected?: boolean;
  xHandle?: string | null;
  xVerifiedAt?: string | null;
}

export interface AuraLoginResult {
  authenticated?: boolean;
  clientId?: string;
  connected?: boolean;
  hasEmail?: boolean;
  hasPasskey?: boolean;
  user?: AuraUser | null;
  walletAddress?: string | null;
}

export interface AuraInventoryItem {
  attributes?: Record<string, unknown>;
  collectionAddress?: string | null;
  collectionId?: string | null;
  collectionImage?: string | null;
  collectionName?: string | null;
  collectionSlug?: string | null;
  details?: string | null;
  image?: string | null;
  name?: string;
  ownedCount?: number;
  packId?: string | null;
  packImage?: string | null;
  packName?: string | null;
  rarity?: number | string | null;
  skuId?: number | string | null;
  traitList?: Array<{ trait_type: string; value: unknown }>;
  traits?: Record<string, unknown>;
  type?: "AURA" | "PACK" | "LOOT" | string;
  weight?: number | null;
}

export interface AuraPagination {
  limit?: number;
  page?: number;
  total?: number;
  totalPages?: number;
}

export interface AuraInventoryResponse {
  data: AuraInventoryItem[];
  items: AuraInventoryItem[];
  meta: AuraPagination;
  pagination: AuraPagination;
  success?: boolean;
}

export interface AuraRequestOptions extends AuraConfigOptions {
  body?: unknown;
  cache?: RequestCache;
  credentials?: RequestCredentials;
  headers?: Record<string, string>;
  method?: string;
  raw?: boolean;
  signal?: AbortSignal;
}

export interface AuraUserRefOptions extends AuraRequestOptions {
  address?: string;
  refresh?: boolean;
  user?: AuraUser;
  userAddress?: string;
  userId?: string;
  userRef?: string;
  username?: string;
  walletAddress?: string;
}

export interface AuraInventoryOptions extends AuraUserRefOptions {
  collection?: string | string[];
  collections?: string | string[];
  condensed?: boolean | string;
  limit?: number;
  ownedOnly?: boolean | string;
  packType?: string;
  page?: number;
}

export interface AuraCreatedPacksOptions extends AuraUserRefOptions {
  limit?: number;
  page?: number;
  sort?: string;
  status?: string;
}

export interface AuraSignInOptions extends AuraConfigOptions {
  allowGuest?: boolean;
  closeOnSuccess?: boolean;
  debug?: boolean;
  display?: "popup" | "iframe" | "modal" | "embedded" | string;
  keepOpen?: boolean;
  onClose?: (error: Error & { code?: string }) => void;
  onError?: (error: Error & { code?: string }) => void;
  onSuccess?: (result: AuraLoginResult) => void;
  popupFeatures?: string;
  popupHeight?: number;
  popupName?: string;
  popupWidth?: number;
  scope?: string | string[];
  scopes?: string | string[];
  uxMode?: "popup" | "iframe" | "modal" | "embedded" | string;
}

export interface AuraSigninButtonOptions extends AuraSignInOptions {
  buttonClassName?: string;
  className?: string;
  container: string | HTMLElement;
  size?: "sm" | "md" | "lg" | string;
  text?: string;
}

export interface AuraSigninWithAuraProps extends AuraSignInOptions {
  buttonClassName?: string;
  children?: unknown;
  className?: string;
  disabled?: boolean;
  onClick?: (event: unknown) => void;
  React?: unknown;
  size?: "sm" | "md" | "lg" | string;
  text?: string;
}

export interface AuraApiNamespace {
  getCapabilities(options?: AuraRequestOptions): Promise<unknown>;
  getCreatedPacks(input?: string | AuraCreatedPacksOptions, options?: AuraCreatedPacksOptions): Promise<unknown>;
  getCurrentInventory(options?: AuraInventoryOptions): Promise<AuraInventoryResponse>;
  getCurrentUserInventory(options?: AuraInventoryOptions): Promise<AuraInventoryResponse>;
  getDeveloperCapabilities(options?: AuraRequestOptions): Promise<unknown>;
  getInventory(input?: string | AuraInventoryOptions, options?: AuraInventoryOptions): Promise<AuraInventoryResponse>;
  getMarketplaceCatalog(options?: AuraRequestOptions): Promise<unknown>;
  getMarketplaceOffers(options?: string | AuraRequestOptions): Promise<unknown>;
  getMarketplaceSkuOffers(agentId: string, options?: AuraRequestOptions): Promise<unknown>;
  getMarketplaceV2Offers(options?: AuraRequestOptions): Promise<unknown>;
  getPack(slugOrAddress: string, options?: AuraRequestOptions): Promise<unknown>;
  getPackLive(slugOrAddress: string, options?: AuraRequestOptions): Promise<unknown>;
  getPackStatic(slugOrAddress: string, options?: AuraRequestOptions): Promise<unknown>;
  getUser(input?: string | AuraUserRefOptions, options?: AuraUserRefOptions): Promise<AuraUser>;
  request(path: string, options?: AuraRequestOptions): Promise<unknown>;
}

export interface AuraSdk extends AuraApiNamespace {
  React: {
    SigninWithAura(props: AuraSigninWithAuraProps): unknown;
  };
  SignInButton(options: AuraSigninButtonOptions): HTMLButtonElement;
  SigninButton(options: AuraSigninButtonOptions): HTMLButtonElement;
  SigninWithAura(props: AuraSigninWithAuraProps): unknown;
  api: AuraApiNamespace;
  clearSession(): void;
  configure(options?: AuraConfigOptions): AuraConfig;
  getCatalog(options?: AuraRequestOptions): Promise<unknown>;
  getConfig(): AuraConfig;
  getCurrentUser(): AuraUser | null;
  getOffers(options?: string | AuraRequestOptions): Promise<unknown>;
  getPackDetail(slugOrAddress: string, options?: AuraRequestOptions): Promise<unknown>;
  getProfile(input?: string | AuraUserRefOptions, options?: AuraUserRefOptions): Promise<AuraUser>;
  getSession(): AuraLoginResult | null;
  getWalletAddress(): string | null;
  signIn(options: AuraSignInOptions): Promise<AuraLoginResult | null>;
  version: string;
}
