export type SoleMegaGateMethod =
  | "manifest"
  | "signup"
  | "login"
  | "adminLogin"
  | "pinLogin"
  | "combinedPinLogin"
  | "setupPin"
  | "recoveryLogin"
  | "forgotPassword"
  | "rotateRecovery"
  | "currentSession"
  | "sessionStatus"
  | "authHeaders"
  | "readToken"
  | "writeToken"
  | "clearToken"
  | "mountSessionStatus"
  | "bindAuthForms"
  | "bind"
  | "me"
  | "introspect"
  | "logout"
  | "offers"
  | "checkout"
  | "status";

export interface SoleMegaGateOptions {
  baseUrl?: string;
  tokenKey?: string;
  client?: string;
  eventPrefix?: string;
}

export interface SoleMegaGateSession {
  token: string;
  source: string;
  platform_id: string;
  usage_lane: string;
  actor?: string;
  email?: string;
  role?: string;
  issued_at: string;
  claims?: Record<string, unknown>;
  gate_cards?: Array<{
    id: string;
    name: string;
    status: string;
    scope: string;
    source: string;
  }>;
}

export interface SoleMegaGateStatus {
  ok: boolean;
  token_present: boolean;
  token_preview: string;
  token_key: string;
  source: string;
  platform_id: string;
  usage_lane: string;
  actor: string;
  email: string;
  role: string;
  accepted_headers: string[];
}

export interface SoleMegaGatePinPayload {
  gate_id?: string;
  pin?: string;
  credential?: string;
}

export interface SoleMegaGateRecoveryPayload {
  gate_id?: string;
  recovery_code?: string;
  email?: string;
}

export interface SoleMegaGateAuthPayload {
  email?: string;
  password?: string;
  code?: string;
  [key: string]: unknown;
}

export interface SoleMegaGateCheckoutPayload {
  client_slug?: string;
  offer_id?: string;
  quantity?: number;
  source?: string;
  skyemusicnexus_dynamic?: boolean;
  amount_cents?: number;
  support_amount_cents?: number;
  platform_fee_cents?: number;
  support_goal_cents?: number;
  support_prior_cents?: number;
  support_balance_after_cents?: number;
  support_credit_mode?: "single_support_payment" | "cumulative_artist_store_credit" | string;
  payment_kind?: "artist_store_support" | "video_premiere_access" | "artist_media_subscription" | "release_layaway" | string;
  fee_mode?: "buyer_covered" | string;
  support_target_type?: "artist" | "video" | "song" | "album" | "media_subscription" | string;
  support_target_url?: string;
  artist_name?: string;
  artist_slug?: string;
  product_id?: string;
  product_title?: string;
  product_type?: string;
  name_your_price?: boolean;
  support_no_max?: boolean;
  skyemusicnexus?: Record<string, unknown>;
  success_url?: string;
  cancel_url?: string;
  [key: string]: unknown;
}

export interface SoleMegaGateBindResult {
  ok: boolean;
  reason?: string;
  forms?: number;
  controls?: number;
  status?: SoleMegaGateStatus;
}

export type SoleMegaGateEventHandler = (event: CustomEvent<Record<string, unknown>>) => void;

export declare class SoleMegaGateClient {
  constructor(options?: SoleMegaGateOptions);
  baseUrl: string;
  tokenKey: string;
  defaultClient: string;
  eventPrefix: string;
  readonly token: string;
  url(path: string): string;
  readToken(): string;
  currentSession(meta?: Record<string, unknown>): SoleMegaGateSession | null;
  writeToken(token: unknown, meta?: Record<string, unknown>): SoleMegaGateSession | null;
  clearToken(): void;
  emit(name: string, detail?: Record<string, unknown>): Record<string, unknown>;
  on(name: string, handler: SoleMegaGateEventHandler): () => void;
  sessionStatus(): SoleMegaGateStatus;
  authHeaders(token?: unknown, extra?: Record<string, string>): Record<string, string>;
  request(path: string, options?: RequestInit & { token?: unknown }): Promise<Record<string, unknown>>;
  manifest(): Promise<Record<string, unknown>>;
  signup(payload?: SoleMegaGateAuthPayload): Promise<Record<string, unknown>>;
  login(payload?: SoleMegaGateAuthPayload): Promise<Record<string, unknown>>;
  pinLogin(payload?: SoleMegaGatePinPayload): Promise<Record<string, unknown>>;
  combinedPinLogin(credential: string): Promise<Record<string, unknown>>;
  recoveryLogin(payload?: SoleMegaGateRecoveryPayload): Promise<Record<string, unknown>>;
  adminLogin(payload?: SoleMegaGateAuthPayload): Promise<Record<string, unknown>>;
  forgotPassword(payload?: string | SoleMegaGateRecoveryPayload): Promise<Record<string, unknown>>;
  setupPin(payload?: SoleMegaGatePinPayload): Promise<Record<string, unknown>>;
  rotateRecovery(payload?: SoleMegaGateRecoveryPayload): Promise<Record<string, unknown>>;
  me(): Promise<Record<string, unknown>>;
  introspect(token?: unknown): Promise<Record<string, unknown>>;
  logout(): Promise<Record<string, unknown>>;
  offers(client?: string): Promise<Record<string, unknown>>;
  checkout(payload?: SoleMegaGateCheckoutPayload): Promise<Record<string, unknown>>;
  status(params?: { session_id?: string; demo_session?: string }): Promise<Record<string, unknown>>;
  mountSessionStatus(root?: Document | Element | string): SoleMegaGateBindResult;
  bindAuthForms(root?: Document | Element | string, options?: { payload?: Record<string, unknown> }): SoleMegaGateBindResult;
  bind(root?: Document | Element | string, options?: { payload?: Record<string, unknown> }): SoleMegaGateBindResult;
}

export default SoleMegaGateClient;

declare global {
  interface Window {
    SoleMegaGateClient: typeof SoleMegaGateClient;
  }
}
