import { getAppUrl, isPubliclyReachableAppUrl } from "@/lib/env";
import {
  getOrCreateDefaultBoard,
  getPinterestConfig,
} from "@/lib/social/pinterest-oauth";
import {
  describeImageSkipReason,
  resolvePublishableImageUrl,
} from "@/lib/social/publish-image";

export interface PinterestPublishInput {
  accessToken: string;
  caption: string;
  imageUrl?: string | null;
  linkUrl?: string | null;
  boardId?: string | null;
}

export interface PinterestPublishResult {
  ok: boolean;
  pinId?: string;
  permalink?: string;
  error?: string;
}

export async function publishToPinterest(
  input: PinterestPublishInput,
): Promise<PinterestPublishResult> {
  const { apiBase, appId } = getPinterestConfig();
  if (!appId) return { ok: false, error: "Pinterest is not configured" };
  if (!input.accessToken) return { ok: false, error: "Pinterest account is not connected" };

  if (!input.imageUrl?.trim()) {
    return { ok: false, error: "Pinterest requires an image to create a Pin" };
  }

  const appOrigin = getAppUrl();
  const resolved = await resolvePublishableImageUrl(input.imageUrl, appOrigin);
  if (!resolved) {
    return {
      ok: false,
      error:
        describeImageSkipReason({
          imageUrl: input.imageUrl,
          appOrigin,
          platform: "facebook",
          bufferLoaded: false,
        }) || "Could not resolve image URL for Pinterest",
    };
  }
  if (!isPubliclyReachableAppUrl(appOrigin) && /localhost|127\.0\.0\.1/.test(resolved)) {
    return {
      ok: false,
      error:
        "Pinterest requires a publicly reachable HTTPS image URL. Deploy with a public NEXT_PUBLIC_APP_URL or host media externally.",
    };
  }

  let boardId = input.boardId?.trim() || "";
  try {
    if (!boardId) boardId = await getOrCreateDefaultBoard(input.accessToken);
  } catch (err) {
    return {
      ok: false,
      error: err instanceof Error ? err.message : "Pinterest board lookup failed",
    };
  }

  const body: Record<string, unknown> = {
    board_id: boardId,
    title: (input.caption || "PostSync").slice(0, 100),
    description: (input.caption || "").slice(0, 500),
    media_source: {
      source_type: "image_url",
      url: resolved,
    },
  };
  if (input.linkUrl?.trim()) body.link = input.linkUrl.trim();

  const res = await fetch(`${apiBase}/pins`, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${input.accessToken}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify(body),
  });
  const data = (await res.json()) as {
    id?: string;
    message?: string;
    code?: number;
  };
  if (!res.ok || !data.id) {
    return { ok: false, error: data.message || "Pinterest pin create failed" };
  }

  return {
    ok: true,
    pinId: data.id,
    permalink: `https://www.pinterest.com/pin/${data.id}/`,
  };
}
