import type { ConnectedAccount } from "@/types/workflow";
import { isPlatformPublishReady } from "@/lib/social/platforms";

export function isSimulatedToken(account: ConnectedAccount): boolean {
  return Boolean(account.accessToken?.startsWith("sim_"));
}

export function isTokenExpired(account: ConnectedAccount): boolean {
  if (!account.connected || !account.expiresAt) return false;
  return new Date(account.expiresAt).getTime() <= Date.now();
}

export function getAccountHealth(account: ConnectedAccount): ConnectedAccount["connectionStatus"] {
  if (!account.connected) return "disconnected";
  if (isTokenExpired(account)) return "expired";
  return account.connectionStatus === "error" ? "error" : "connected";
}

export function isAccountPublishReady(
  account: ConnectedAccount & { publishToken?: string | null },
): boolean {
  if (!isPlatformPublishReady(account.platform)) return false;
  const token = account.publishToken ?? account.accessToken;
  if (!token || token.startsWith("sim_")) return false;
  if (!account.connected || getAccountHealth(account) !== "connected") return false;
  return true;
}

export function validateAccountsForPublish(
  accounts: Array<ConnectedAccount & { publishToken?: string | null }>,
  targetPlatforms: string[],
  options?: { allowServerStored?: boolean },
): { ok: true } | { ok: false; message: string; platform?: string } {
  for (const platform of targetPlatforms) {
    if (!isPlatformPublishReady(platform) && platform !== "youtube") continue;

    const account = accounts.find((a) => a.platform === platform);
    if (!account?.connected) {
      return {
        ok: false,
        platform,
        message: `${account?.label ?? platform} is not connected. Connect it in Connected Accounts.`,
      };
    }
    const token = account.publishToken ?? account.accessToken;
    if (!options?.allowServerStored && !token) {
      return {
        ok: false,
        platform,
        message: `${account.label} has no publish token. Reconnect it in Connected Accounts.`,
      };
    }
    if (token && token.startsWith("sim_")) {
      return {
        ok: false,
        platform,
        message: `${account.label} uses a demo token. Reconnect with OAuth to publish.`,
      };
    }
    if (isTokenExpired(account)) {
      return {
        ok: false,
        platform,
        message: `${account.label} token has expired. Reconnect to publish.`,
      };
    }
    if (account.connectionStatus === "error") {
      return {
        ok: false,
        platform,
        message: `${account.label} connection error. Reconnect and try again.`,
      };
    }
  }
  return { ok: true };
}

export function formatLastSynced(iso: string | null | undefined): string {
  if (!iso) return "Never";
  const diffMs = Date.now() - new Date(iso).getTime();
  const hours = Math.floor(diffMs / (1000 * 60 * 60));
  if (hours < 1) return "Just now";
  if (hours < 24) return `${hours} hour${hours === 1 ? "" : "s"} ago`;
  const days = Math.floor(hours / 24);
  return `${days} day${days === 1 ? "" : "s"} ago`;
}
