import type { ConnectedAccount } from "@/types/workflow";
import { getPlatformConfig, isPlatformPublishReady } from "@/lib/social/platforms";
import { getAccountHealth } from "@/lib/social/token-validation";

export const YOUTUBE_NO_VIDEO_MESSAGE =
  "YouTube requires a generated video. Set VIDEO_PROVIDER=ffmpeg in .env.local and regenerate the post.";

export const YOUTUBE_QUICK_PUBLISH_MESSAGE = YOUTUBE_NO_VIDEO_MESSAGE;

export function canPublishToYouTube(post: { videoUrl?: string | null; videoStatus?: string }): boolean {
  return Boolean(post.videoUrl && post.videoStatus === "generated");
}

export type QuickPublishPlatformStatus =
  | "idle"
  | "publishing"
  | "success"
  | "failed"
  | "skipped";

export interface QuickPublishPlatformState {
  platform: string;
  label: string;
  status: QuickPublishPlatformStatus;
  error?: string;
  permalink?: string;
}

export function isAccountQuickPublishReady(account: ConnectedAccount): boolean {
  if (!account.connected) return false;
  if (!isPlatformPublishReady(account.platform)) return false;
  return getAccountHealth(account) === "connected";
}

/** Connected accounts eligible for instant publish (excludes YouTube). */
export function getQuickPublishTargets(accounts: ConnectedAccount[]): ConnectedAccount[] {
  return accounts.filter(isAccountQuickPublishReady);
}

export function isYouTubeConnected(accounts: ConnectedAccount[]): boolean {
  const yt = accounts.find((a) => a.platform === "youtube");
  return Boolean(yt?.connected && getAccountHealth(yt) === "connected");
}

export function buildInitialQuickPublishStates(
  accounts: ConnectedAccount[],
): QuickPublishPlatformState[] {
  const states: QuickPublishPlatformState[] = getQuickPublishTargets(accounts).map((a) => ({
    platform: a.platform,
    label: a.label,
    status: "idle",
  }));

  if (isYouTubeConnected(accounts)) {
    states.push({
      platform: "youtube",
      label: getPlatformConfig("youtube")?.label ?? "YouTube",
      status: "idle",
    });
  }

  return states;
}

export function validateQuickPublish(
  accounts: ConnectedAccount[],
  projectStatus: string,
): { ok: true } | { ok: false; message: string } {
  if (projectStatus === "paused") {
    return { ok: false, message: "Project is paused. Activate it before publishing." };
  }

  const targets = getQuickPublishTargets(accounts);
  if (!targets.length) {
    return {
      ok: false,
      message:
        "No connected publish-ready accounts. Connect LinkedIn, Facebook, or Instagram in Connected Accounts.",
    };
  }

  return { ok: true };
}
