import { getSessionUser } from "@/lib/auth";
import { isKavenixAdminEmail } from "@/lib/kavenix-admin";
import {
  getWordPressIntegrationStatus,
  publishWordPressPost,
  syncWordPressDraft,
} from "@/lib/wordpress-syndication";

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

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

  if (message === "wordpress-not-configured") {
    return "WordPress.com 사이트와 발행 토큰이 설정되지 않았습니다.";
  }

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

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

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

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: "최고관리자만 WordPress.com 연결 상태를 확인할 수 있습니다." },
      { 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 getWordPressIntegrationStatus(postId);
    return Response.json({ ok: true, status });
  } catch (error) {
    return Response.json(
      { error: "admin-wordpress-status-failed", message: messageForError(error) },
      { status: 500 },
    );
  }
}

export async function POST(request: Request) {
  if (!await requireAdmin()) {
    return Response.json(
      { error: "forbidden", message: "최고관리자만 WordPress.com에 글을 보낼 수 있습니다." },
      { 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: "WordPress.com 요청값을 다시 확인해 주세요." },
      { status: 400 },
    );
  }

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