import { redirect } from "next/navigation";
import { AuthPageShell } from "@/components/auth-page-shell";
import { SignupPageForm } from "@/components/signup-page-form";
import {
  getMailEntryUrlForCurrentRequest,
  getSessionUser,
  redirectToCanonicalMailAuthHostIfNeeded,
} from "@/lib/auth";
import { toSearchString } from "@/lib/mail-urls";

type SignupPageProps = {
  searchParams?: Promise<Record<string, string | string[] | undefined>>;
};

function pickParam(value: string | string[] | undefined) {
  return Array.isArray(value) ? value[0] : value;
}

export default async function SignupPage({ searchParams }: SignupPageProps) {
  const params = searchParams ? await searchParams : {};
  await redirectToCanonicalMailAuthHostIfNeeded(
    "/signup",
    toSearchString(params),
  );
  const user = await getSessionUser();
  const error = pickParam(params.error);
  const errorMessage = error
    ? error === "required"
      ? "사업자명, 도메인, 대표 메일 아이디, 비밀번호, 보조 이메일을 모두 입력해주세요."
      : error === "password-mismatch"
        ? "비밀번호 확인이 일치하지 않습니다."
        : error === "recovery-email-required"
          ? "보조 이메일을 입력해주세요."
          : error === "recovery-email-invalid"
            ? "보조 이메일 형식이 올바르지 않습니다."
            : error === "recovery-email-unverified"
              ? "보조 이메일 인증을 완료해야 회원가입할 수 있습니다."
              : error === "recovery-email-expired"
                ? "보조 이메일 인증이 만료되었습니다. 인증번호를 다시 받아주세요."
                : error === "email-exists"
                  ? "이미 등록된 대표 메일 주소입니다. 로그인 또는 비밀번호 재설정을 이용해주세요."
                  : error === "domain-taken"
                    ? "이미 다른 계정에서 사용 중인 도메인입니다."
                    : error === "invalid-local-part"
                      ? "대표 메일 아이디는 영문 소문자, 숫자, 점(.), 하이픈(-), 밑줄(_)만 사용할 수 있습니다."
                      : error === "mail-config"
                        ? "메일 서버 설정값이 올바르지 않습니다."
                        : error === "mail-auth"
                          ? "메일 서버 API 인증에 실패했습니다."
                          : error === "mail-domain-exists"
                            ? "메일 서버에 이미 같은 도메인이 있어 자동 연결하지 못했습니다."
                            : error === "mail-setup"
                              ? "메일 서버 생성 중 오류가 발생했습니다."
                              : "회원가입 처리 중 오류가 발생했습니다."
    : null;

  if (user) {
    redirect(await getMailEntryUrlForCurrentRequest(user));
  }

  return (
    <AuthPageShell
      title="회원가입"
      description="도메인과 대표 메일을 먼저 만들고, 그 대표 메일 주소로 바로 로그인하는 가입 흐름입니다."
    >
      <SignupPageForm initialErrorMessage={errorMessage} />
    </AuthPageShell>
  );
}
