import { getSessionUser } from "@/lib/auth";
import {
  getBloggerIntegrationStatus,
  publishBloggerPost,
  syncBloggerDraft,
} from "@/lib/blogger-syndication";
import { isKavenixAdminEmail } from "@/lib/kavenix-admin";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

function messageForError(error: unknown) {
  const message = error instanceof Error ? error.message : "blogger-request-failed";

  if (message === "blogger-not-configured") {
    return "Blogger 블로그 ID와 주소가 설정되지 않았습니다.";
  }

  if (message === "blogger-not-connected" || message === "blogger-permission-required") {
    return "Google 계정에서 Blogger 발행 권한을 먼저 연결해 주세요.";
  }

  if (message === "blogger-source-not-published") {
    return "오피셜메일에서 발행된 글만 Blogger 초안으로 만들 수 있습니다.";
  }

  if (message === "blogger-draft-not-found") {
    return "공개할 Blogger 초안을 찾지 못했습니다.";
  }

  return message || "Blogger 처리 중 오류가 발생했습니다.";
}

async function requireAdmin() {
  const user = await getSessionUser();
  return user && isKavenixAdminEmail(user.email) ? user : null;
}

export async function GET(request: Request) {
  if (!await requireAdmin()) {
    return Response.json(
      { error: "forbidden", message: "최고관리자만 Blogger 연결 상태를 확인할 수 있습니다." },
      { status: 403 },
    );
  }

  const rawPostId = new URL(request.url).searchParams.get("postId");
  const postId = rawPostId ? Number(rawPostId) : null;

  if (rawPostId && (!Number.isSafeInteger(postId) || Number(postId) <= 0)) {
    return Response.json({ error: "invalid-post-id", message: "게시글 번호가 올바르지 않습니다." }, { status: 400 });
  }

  try {
    const status = await getBloggerIntegrationStatus(postId);
    return Response.json({ ok: true, status });
  } catch (error) {
    return Response.json(
      { error: "admin-blogger-status-failed", message: messageForError(error) },
      { status: 500 },
    );
  }
}

export async function POST(request: Request) {
  if (!await requireAdmin()) {
    return Response.json(
      { error: "forbidden", message: "최고관리자만 Blogger에 글을 보낼 수 있습니다." },
      { status: 403 },
    );
  }

  const payload = await request.json().catch(() => null) as {
    action?: unknown;
    postId?: unknown;
  } | null;
  const postId = Number(payload?.postId);
  const action = payload?.action;

  if (!Number.isSafeInteger(postId) || postId <= 0 || (action !== "sync" && action !== "publish")) {
    return Response.json({ error: "invalid-request", message: "Blogger 요청값을 다시 확인해 주세요." }, { status: 400 });
  }

  try {
    const status = action === "publish"
      ? await publishBloggerPost(postId)
      : await syncBloggerDraft(postId);
    return Response.json({
      ok: true,
      status,
      message: action === "publish"
        ? "Blogger에 글을 공개했습니다."
        : status.post?.status === "published"
          ? "Blogger 공개 글을 최신 내용으로 동기화했습니다."
          : "Blogger 초안을 만들었습니다.",
    });
  } catch (error) {
    return Response.json(
      { error: "admin-blogger-action-failed", message: messageForError(error) },
      { status: 400 },
    );
  }
}
