import { getMetaGraphBase, isPubliclyReachableAppUrl } from "@/lib/env";
import { publicImageUrl } from "@/lib/social/meta-oauth";
import { withMetaAccessToken } from "@/lib/social/meta-graph";

export interface InstagramPublishResult {
  success: boolean;
  postId?: string;
  permalink?: string;
  error?: string;
}

export async function publishToInstagram(input: {
  igUserId: string;
  pageAccessToken: string;
  caption: string;
  imageUrl?: string | null;
  appOrigin: string;
}): Promise<InstagramPublishResult> {
  try {
    const image = publicImageUrl(input.imageUrl, input.appOrigin);
    if (!image || image.includes(".svg")) {
      return {
        success: false,
        error: "Instagram requires a public PNG/JPEG image URL. SVG template images are not supported.",
      };
    }

    if (!isPubliclyReachableAppUrl(input.appOrigin)) {
      return {
        success: false,
        error: `Instagram cannot fetch images from ${input.appOrigin}. Set NEXT_PUBLIC_APP_URL to your public HTTPS domain (production or ngrok).`,
      };
    }

    const createParams = withMetaAccessToken(input.pageAccessToken);
    createParams.set("image_url", image);
    createParams.set("caption", input.caption.slice(0, 2200));

    const createRes = await fetch(`${getMetaGraphBase()}/${input.igUserId}/media?${createParams.toString()}`, {
      method: "POST",
    });
    const created = (await createRes.json()) as { id?: string; error?: { message?: string } };
    if (!createRes.ok || !created.id) {
      return { success: false, error: created.error?.message ?? "Instagram media create failed" };
    }

    const publishParams = withMetaAccessToken(input.pageAccessToken);
    publishParams.set("creation_id", created.id);
    const publishRes = await fetch(
      `${getMetaGraphBase()}/${input.igUserId}/media_publish?${publishParams.toString()}`,
      { method: "POST" },
    );
    const published = (await publishRes.json()) as { id?: string; error?: { message?: string } };
    if (!publishRes.ok || !published.id) {
      return { success: false, error: published.error?.message ?? "Instagram publish failed" };
    }

    return {
      success: true,
      postId: published.id,
      permalink: `https://www.instagram.com/p/${published.id}`,
    };
  } catch (error) {
    return {
      success: false,
      error: error instanceof Error ? error.message : "Instagram publish failed",
    };
  }
}
