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

type CreateKavenixMemberPayload = {
  allowCancelledPlan?: boolean;
  displayName?: string;
  domainId?: number;
  localPart?: string;
  password?: string;
};

function mapCreateMemberError(error: unknown) {
  const code = error instanceof Error ? error.message : "member-create-failed";

  switch (code) {
    case "kavenix-domain-not-found":
      return { code, message: "선택한 도메인을 찾을 수 없습니다.", status: 404 };
    case "kavenix-domain-cleaned":
      return { code, message: "정리된 도메인에는 사용자를 추가할 수 없습니다.", status: 409 };
    case "growth-plan-required":
      return {
        code,
        message: "무료 플랜 도메인에는 사용자를 추가할 수 없습니다. 성장플랜 구독 후 다시 시도해 주세요.",
        status: 409,
      };
    case "growth-plan-cancelled-confirmation-required":
      return {
        code,
        message: "현재 도메인은 해지 상태입니다.",
        status: 409,
      };
    case "member-required":
      return { code, message: "이름, 아이디, 비밀번호를 모두 입력해 주세요.", status: 400 };
    case "invalid-local-part":
      return {
        code,
        message: "메일 아이디는 영문 소문자, 숫자, 점(.), 하이픈(-), 밑줄(_)만 사용할 수 있습니다.",
        status: 400,
      };
    case "member-mailbox-taken":
      return { code, message: "이미 사용 중인 메일 아이디입니다.", status: 409 };
    default:
      return { code, message: "사용자 추가 중 오류가 발생했습니다.", status: 500 };
  }
}

export async function POST(request: Request) {
  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 payload = await request.json().catch(() => null) as CreateKavenixMemberPayload | null;

  if (!payload) {
    return Response.json(
      { error: "invalid-json", message: "입력 정보를 다시 확인해 주세요." },
      { status: 400 },
    );
  }

  try {
    const result = await createKavenixManagedMember({
      allowCancelledPlan: payload.allowCancelledPlan === true,
      displayName: typeof payload.displayName === "string" ? payload.displayName : "",
      domainId: Number(payload.domainId),
      localPart: typeof payload.localPart === "string" ? payload.localPart : "",
      password: typeof payload.password === "string" ? payload.password : "",
    });

    return Response.json({
      message:
        result.planStatus === "cancelled"
          ? `${result.email} 사용자를 추가했습니다. 해지된 플랜의 이용 종료 시점에는 다른 멤버와 함께 사용이 중지됩니다.`
          : `${result.email} 사용자를 추가했습니다. 이번 추가는 즉시 청구되지 않고 다음 정기결제에 반영됩니다.`,
      ok: true,
      result,
    });
  } catch (error) {
    const mapped = mapCreateMemberError(error);

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