/**
 * OAuth token lifecycle statuses for Connected Accounts UI + publish gates.
 */

import type { ConnectedAccount, ConnectionStatus } from "@/types/workflow";

export type TokenLifecycleStatus =
  | "CONNECTED"
  | "EXPIRING_SOON"
  | "EXPIRED"
  | "REAUTH_REQUIRED"
  | "REVOKED"
  | "DISCONNECTED";

/** Warn when token expires within this window (default 48h). */
export function getTokenExpiringSoonMs(): number {
  const hours = Number.parseInt(process.env.SOCIAL_TOKEN_EXPIRING_SOON_HOURS ?? "48", 10);
  const h = Number.isFinite(hours) && hours > 0 ? hours : 48;
  return h * 60 * 60 * 1000;
}

export function getTokenLifecycleStatus(
  account: ConnectedAccount,
): TokenLifecycleStatus {
  if (!account.connected) return "DISCONNECTED";

  if (account.connectionStatus === "error") return "REAUTH_REQUIRED";
  if (account.connectionStatus === "expired") return "EXPIRED";
  if (account.connectionStatus === "disconnected") return "DISCONNECTED";

  if (account.expiresAt) {
    const expiresMs = new Date(account.expiresAt).getTime();
    if (Number.isFinite(expiresMs)) {
      if (expiresMs <= Date.now()) return "EXPIRED";
      if (expiresMs - Date.now() <= getTokenExpiringSoonMs()) return "EXPIRING_SOON";
    }
  }

  if (account.connectionStatus === "connected") return "CONNECTED";
  return "REAUTH_REQUIRED";
}

export function tokenLifecycleLabel(status: TokenLifecycleStatus): string {
  switch (status) {
    case "CONNECTED":
      return "Connected";
    case "EXPIRING_SOON":
      return "Token expiring soon";
    case "EXPIRED":
      return "Token expired";
    case "REAUTH_REQUIRED":
      return "Reauthentication required";
    case "REVOKED":
      return "Token revoked";
    case "DISCONNECTED":
      return "Not connected";
  }
}

export function tokenLifecycleNeedsReconnect(status: TokenLifecycleStatus): boolean {
  return (
    status === "EXPIRED" ||
    status === "REAUTH_REQUIRED" ||
    status === "REVOKED" ||
    status === "EXPIRING_SOON"
  );
}

/** Map lifecycle → legacy ConnectionStatus for existing UI helpers. */
export function lifecycleToConnectionStatus(
  status: TokenLifecycleStatus,
): ConnectionStatus {
  switch (status) {
    case "CONNECTED":
    case "EXPIRING_SOON":
      return "connected";
    case "EXPIRED":
    case "REVOKED":
      return "expired";
    case "REAUTH_REQUIRED":
      return "error";
    case "DISCONNECTED":
      return "disconnected";
  }
}
