import { revalidatePath } from "next/cache";
import { getSessionUser } from "@/lib/auth";
import { sendKavenixDkimReminders } from "@/lib/dkim-reminders";
import { isKavenixAdminEmail } from "@/lib/kavenix-admin";

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

type ReminderPayload = {
  bodyTemplate?: unknown;
  domainIds?: unknown;
  reminderType?: unknown;
  subjectTemplate?: unknown;
};

function errorResponse(error: unknown) {
  const code = error instanceof Error ? error.message : "reminder-send-failed";
  const unsupportedToken = code.startsWith("reminder-unsupported-placeholder:")
    ? code.slice("reminder-unsupported-placeholder:".length)
    : "";
  const messages: Record<string, string> = {
    "reminder-body-required": "메일 본문을 입력해주세요.",
    "reminder-body-too-long": "메일 본문은 10,000자 이하로 입력해주세요.",
    "reminder-domain-selection-invalid": "한 번에 1~10개 도메인을 선택해주세요.",
    "reminder-subject-required": "메일 제목을 입력해주세요.",
    "reminder-subject-too-long": "메일 제목은 180자 이하로 입력해주세요.",
    "reminder-type-invalid": "안내 대상 분류가 올바르지 않습니다.",
  };

  return Response.json(
    {
      error: code,
      message: unsupportedToken
        ? `지원하지 않는 치환 단어가 있습니다: ${unsupportedToken}`
        : messages[code] ?? "DKIM 안내 메일 발송에 실패했습니다.",
      ok: false,
    },
    { status: 400 },
  );
}

export async function POST(request: Request) {
  const user = await getSessionUser();

  if (!user || !isKavenixAdminEmail(user.email)) {
    return Response.json({ error: "forbidden", ok: false }, { status: 403 });
  }

  const payload = (await request.json().catch(() => null)) as ReminderPayload | null;

  if (!payload) {
    return Response.json({ error: "invalid-request", ok: false }, { status: 400 });
  }

  try {
    const results = await sendKavenixDkimReminders({
      bodyTemplate: payload.bodyTemplate,
      domainIds: payload.domainIds,
      reminderType: payload.reminderType,
      requestedByEmail: user.email,
      subjectTemplate: payload.subjectTemplate,
    });
    revalidatePath("/kavenix");
    return Response.json({ ok: true, results });
  } catch (error) {
    return errorResponse(error);
  }
}
