import { apiBase, getJSONAuth, postJSON } from "../api";

export type WalletLoginResponse = {
  token: string;
  wallet: string;
};

export type WalletMeResponse = {
  wallet: string;
  role: "user";
};

export type TokenPocketLoginRequest = {
  actionId: string;
  nonce: string;
  message: string;
  qrUrl: string;
  expiresAt: string;
};

export type TokenPocketLoginResult =
  | {
      status: "pending" | "expired" | "failed";
      message?: string;
      error?: string;
    }
  | {
      status: "completed";
      address: string;
      message: string;
      signature: string;
    };

export function loginWithWallet(address: string): Promise<WalletLoginResponse> {
  return postJSON<WalletLoginResponse>("/api/auth/wallet/login", { address });
}

export function fetchWalletMe(token: string): Promise<WalletMeResponse> {
  return getJSONAuth<WalletMeResponse>("/api/auth/wallet/me", token);
}

export function createTokenPocketLoginRequest(): Promise<TokenPocketLoginRequest> {
  return postJSON<TokenPocketLoginRequest>(
    "/api/auth/wallet/tp-login-request",
    {},
  );
}

export async function fetchTokenPocketLoginResult(
  actionId: string,
  signal?: AbortSignal,
): Promise<TokenPocketLoginResult> {
  const res = await fetch(
    `${apiBase}/api/auth/wallet/tp-result?actionId=${encodeURIComponent(actionId)}`,
    { signal },
  );
  if (!res.ok) throw new Error(await res.text());
  return res.json() as Promise<TokenPocketLoginResult>;
}
