import { revalidatePath } from "next/cache";
import { getSessionUser } from "@/lib/auth";
import {
  getKavenixDomainSetupAssistanceCredentials,
  sendKavenixDomainSetupAssistanceStatusNotification,
  updateKavenixDomainSetupAssistanceRequest,
} from "@/lib/domain-setup-assistance";
import { isKavenixAdminEmail } from "@/lib/kavenix-admin";

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

type UpdatePayload = {
  adminNote?: unknown;
  status?: unknown;
};

async function requireAdmin() {
  const user = await getSessionUser();
  return user && isKavenixAdminEmail(user.email) ? user : null;
}

function requestIdFromContext(context: RouteContext<"/api/kavenix/domain-assistance/[requestId]">) {
  return context.params.then(({ requestId }) => Number(requestId));
}

function requestErrorResponse(error: unknown) {
  const code = error instanceof Error ? error.message : "domain-assistance-request-failed";
  const paymentFailurePrefix = "domain-assistance-payment-failed:";
  const paymentFailureDetail = code.startsWith(paymentFailurePrefix)
    ? code.slice(paymentFailurePrefix.length).trim()
    : "";
  const messages: Record<string, string> = {
    "domain-assistance-credentials-purged": "보관 기간이 지나거나 처리가 끝나 계정정보가 폐기되었습니다.",
    "domain-assistance-cancellation-reason-required": "신청자에게 안내할 취소 사유를 입력해주세요.",
    "domain-assistance-invalid-status": "변경할 처리 상태가 올바르지 않습니다.",
    "domain-assistance-invalid-transition": "완료되거나 취소된 신청의 처리 상태는 되돌릴 수 없습니다.",
    "domain-assistance-not-found": "설정 대행 신청을 찾을 수 없습니다.",
    "domain-assistance-payment-processing": "이미 자동결제를 처리하고 있습니다. 잠시 후 다시 확인해주세요.",
  };

  return Response.json(
    {
      error: code.startsWith(paymentFailurePrefix)
        ? "domain-assistance-payment-failed"
        : code,
      message: paymentFailureDetail
        ? `자동결제에 실패해 완료 처리하지 않았습니다. ${paymentFailureDetail}`
        : messages[code] ?? "설정 대행 신청 처리에 실패했습니다.",
      ok: false,
    },
    { status: code === "domain-assistance-not-found" ? 404 : 400 },
  );
}

export async function GET(
  _request: Request,
  context: RouteContext<"/api/kavenix/domain-assistance/[requestId]">,
) {
  if (!(await requireAdmin())) {
    return Response.json({ error: "forbidden", ok: false }, { status: 403 });
  }

  const requestId = await requestIdFromContext(context);

  if (!Number.isInteger(requestId) || requestId <= 0) {
    return Response.json({ error: "invalid-request-id", ok: false }, { status: 400 });
  }

  try {
    const credentials = await getKavenixDomainSetupAssistanceCredentials(requestId);
    return Response.json({ credentials, ok: true });
  } catch (error) {
    return requestErrorResponse(error);
  }
}

export async function PATCH(
  request: Request,
  context: RouteContext<"/api/kavenix/domain-assistance/[requestId]">,
) {
  if (!(await requireAdmin())) {
    return Response.json({ error: "forbidden", ok: false }, { status: 403 });
  }

  const requestId = await requestIdFromContext(context);
  const payload = (await request.json().catch(() => null)) as UpdatePayload | null;

  if (!Number.isInteger(requestId) || requestId <= 0 || !payload) {
    return Response.json({ error: "invalid-request", ok: false }, { status: 400 });
  }

  try {
    const updatedRequest = await updateKavenixDomainSetupAssistanceRequest(requestId, {
      adminNote: String(payload.adminNote ?? ""),
      status: String(payload.status ?? ""),
    });
    let notificationSent: boolean | null = null;

    if (updatedRequest.transitioned) {
      try {
        notificationSent = await sendKavenixDomainSetupAssistanceStatusNotification(
          requestId,
          updatedRequest.status,
        );
      } catch (error) {
        notificationSent = false;
        console.error("Domain setup assistance status notification failed", error);
      }
    }

    revalidatePath("/kavenix");
    return Response.json({ notificationSent, ok: true, request: updatedRequest });
  } catch (error) {
    return requestErrorResponse(error);
  }
}
