import { getSessionUser } from "@/lib/auth";
import {
  isKavenixAdminEmail,
  repairKavenixDomainProvisioningById,
} from "@/lib/kavenix-admin";

function repairErrorMessage(error: unknown) {
  if (!(error instanceof Error)) {
    return "메일 연결 복구에 실패했습니다.";
  }

  switch (error.message) {
    case "kavenix-domain-not-found":
      return "복구할 도메인을 찾을 수 없습니다.";
    case "kavenix-domain-cleaned":
      return "정리된 도메인은 메일 연결을 복구할 수 없습니다.";
    case "kavenix-domain-input-invalid":
      return "정상적인 도메인 형식이 아니어서 자동 복구하지 않았습니다.";
    case "kavenix-mailbox-data-missing":
      return "대표 메일함 또는 저장된 인증 정보를 찾을 수 없습니다.";
    case "kavenix-mailcow-domain-missing":
      return "Mailcow 도메인 자체가 없어 자동 복구하지 않았습니다. DKIM 상태를 포함해 수동 점검이 필요합니다.";
    case "kavenix-domain-dns-values-changed":
      return "복구 중 DNS 안내값 변경이 감지되어 작업을 중단했습니다.";
    case "kavenix-domain-repair-incomplete":
      return "대표 메일함을 준비했지만 최종 연결 검증을 통과하지 못했습니다.";
    default:
      return "메일 연결 복구에 실패했습니다. Mailcow 상태를 확인해주세요.";
  }
}

export async function POST(
  _request: Request,
  context: RouteContext<"/api/kavenix/domains/[domainId]/repair">,
) {
  const user = await getSessionUser();

  if (!user) {
    return Response.json(
      { error: "unauthorized", message: "로그인이 필요합니다." },
      { status: 401 },
    );
  }

  if (!isKavenixAdminEmail(user.email)) {
    return Response.json(
      { error: "forbidden", message: "최고관리자만 메일 연결을 복구할 수 있습니다." },
      { status: 403 },
    );
  }

  const { domainId } = await context.params;

  try {
    const result = await repairKavenixDomainProvisioningById(Number(domainId));

    return Response.json({
      message: result.mailboxCreated
        ? result.dnsVerified
          ? `${result.domain}의 누락된 대표 메일함을 생성하고 연결을 활성화했습니다.${result.mailboxPasswordRotated ? " 메일함 인증 정보도 현재 보안 기준에 맞게 갱신했습니다." : ""} 고객 DNS 값은 변경하지 않았습니다.`
          : `${result.domain}의 누락된 대표 메일함을 생성했습니다.${result.mailboxPasswordRotated ? " 메일함 인증 정보도 현재 보안 기준에 맞게 갱신했습니다." : ""} DNS 설정은 아직 미완료라 DNS 대기 상태를 유지하며, 고객 DNS 값은 변경하지 않았습니다.`
        : result.verified
          ? `${result.domain}의 연결 상태를 다시 검증해 활성화했습니다. 고객 DNS 값은 변경하지 않았습니다.`
          : `${result.domain}의 메일함 상태를 확인했습니다. DNS 설정은 아직 미완료라 DNS 대기 상태를 유지합니다.`,
      ok: true,
      result,
    });
  } catch (error) {
    return Response.json(
      {
        error: error instanceof Error ? error.message : "domain-repair-failed",
        message: repairErrorMessage(error),
      },
      { status: 400 },
    );
  }
}
