import { resolveMailAppUrlFromHeaders } from "@/lib/mail-urls";
import { requestPasswordResetLink } from "@/lib/official-mail";

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

type PasswordResetRequestBody = {
  companyName?: string;
  email?: string;
};

function mapRequestError(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 === "recovery-email-missing") {
    return {
      error: "recovery-email-missing",
      message: "보조 이메일이 등록되지 않았거나 아직 인증되지 않은 계정입니다.",
      status: 409,
    };
  }

  return {
    error: "system",
    message: "비밀번호 재설정 메일을 보내지 못했습니다. 잠시 후 다시 시도해주세요.",
    status: 500,
  };
}

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

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

  try {
    const mailAppUrl = resolveMailAppUrlFromHeaders(request.headers);
    const result = await requestPasswordResetLink({
      companyName: body?.companyName ?? "",
      email: body?.email ?? "",
      mailAppUrl,
    });

    return Response.json({
      ...result,
      message: `보조 이메일 ${result.maskedRecoveryEmail} 로 비밀번호 재설정 링크를 보냈습니다.`,
    });
  } catch (error) {
    console.error("App password reset request failed", error);
    const mapped = mapRequestError(error);

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