import { verifySignupRecoveryEmailCode } from "@/lib/official-mail";

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

type VerifySignupRecoveryEmailRequestBody = {
  challengeId?: number;
  code?: string;
  recoveryEmail?: string;
};

function mapVerifyError(error: unknown) {
  if (!(error instanceof Error)) {
    return {
      error: "system",
      message: "인증번호 확인 중 오류가 발생했습니다.",
      status: 500,
    };
  }

  if (error.message === "required") {
    return {
      error: "required",
      message: "인증번호를 입력해주세요.",
      status: 400,
    };
  }

  if (error.message === "not-found") {
    return {
      error: "not-found",
      message: "인증요청을 찾지 못했습니다. 인증번호를 다시 받아주세요.",
      status: 404,
    };
  }

  if (error.message === "expired") {
    return {
      error: "expired",
      message: "인증시간이 만료되었습니다. 인증번호를 다시 받아주세요.",
      status: 400,
    };
  }

  if (error.message === "invalid-code") {
    return {
      error: "invalid-code",
      message: "인증번호가 일치하지 않습니다.",
      status: 400,
    };
  }

  return {
    error: "system",
    message: "인증번호 확인 중 오류가 발생했습니다.",
    status: 500,
  };
}

export async function POST(request: Request) {
  let body: VerifySignupRecoveryEmailRequestBody | null = null;

  try {
    body = await request.json();
  } catch {
    return Response.json(
      {
        error: "invalid-json",
        message: "요청 형식이 올바르지 않습니다.",
      },
      { status: 400 },
    );
  }

  try {
    const result = await verifySignupRecoveryEmailCode({
      challengeId: Number(body?.challengeId ?? 0),
      code: body?.code ?? "",
      recoveryEmail: body?.recoveryEmail ?? "",
    });

    return Response.json(result);
  } catch (error) {
    console.error("Signup recovery email verify failed", error);
    const mapped = mapVerifyError(error);

    return Response.json(mapped, { status: mapped.status });
  }
}
