/**
 * [인증 관련 상수 정의]
 *
 * 인증 모듈 전체에서 공통으로 사용하는 상수들을 정의합니다.
 * - 에러 메시지
 * - 라우트 경로
 * - 검증 규칙
 */

// ========================================
// 에러 메시지 상수
// ========================================

/**
 * 인증 에러 메시지 매핑
 * Supabase의 영문 에러를 한글로 변환하기 위한 매핑 테이블
 */
export const AUTH_ERROR_MESSAGES = {
  // === 로그인/회원가입 관련 ===
  INVALID_CREDENTIALS: "이메일 또는 비밀번호가 일치하지 않습니다.",
  USER_EXISTS: "이미 가입된 이메일 주소입니다.",
  EMAIL_NOT_CONFIRMED: "이메일 인증이 완료되지 않았습니다.",

  // === 입력값 검증 ===
  EMPTY_FIELDS: "이메일과 비밀번호를 모두 입력해 주세요.",
  EMPTY_EMAIL: "이메일을 입력해 주세요.",
  INVALID_EMAIL: "올바른 이메일 형식이 아닙니다.",

  // === 비밀번호 관련 ===
  PASSWORD_TOO_SHORT: "비밀번호는 최소 6자 이상이어야 합니다.",
  PASSWORD_TOO_WEAK:
    "비밀번호는 최소 6자 이상, 숫자, 특수문자를 각각 1개 이상 포함해야 합니다.",
  PASSWORD_SAME_AS_OLD: "새 비밀번호는 기존 비밀번호와 달라야 합니다.",

  // === 비밀번호 재설정 ===
  PASSWORD_RESET_SENT: "비밀번호 재설정 링크를 이메일로 발송했습니다.",
  PASSWORD_RESET_SUCCESS: "비밀번호가 성공적으로 변경되었습니다.",
  PASSWORD_RESET_FAILED: "비밀번호 변경에 실패했습니다.",

  // === 인증 링크 ===
  INVALID_AUTH_LINK: "인증 링크가 만료되었거나 유효하지 않습니다.",

  // === Rate Limit ===
  EMAIL_RATE_LIMIT:
    "이메일 발송 제한을 초과했습니다. 잠시 후 다시 시도해 주세요.",
  EMAIL_RATE_LIMIT_DETAILED:
    "이메일 발송 제한을 초과했습니다. Supabase 무료 플랜은 시간당 이메일 발송 횟수가 제한됩니다. 약 1시간 후에 다시 시도해 주세요.",

  // === 기타 ===
  DEFAULT: "요청을 처리하는 중 오류가 발생했습니다.",
} as const;

// ========================================
// 라우트 경로 상수
// ========================================

/**
 * 인증 관련 라우트 경로
 */
export const AUTH_ROUTES = {
  LOGIN: "/login",
  SIGNUP: "/signup",
  FORGOT_PASSWORD: "/forgot-password",
  RESET_PASSWORD: "/reset-password",
  AUTH_CONFIRM: "/auth/confirm",
  AUTH_CALLBACK: "/auth/callback",
  HOME: "/",
} as const;

/**
 * 로그인 없이 접근 가능한 페이지 목록
 * 미들웨어에서 라우트 보호에 사용
 */
export const PUBLIC_AUTH_PAGES = [
  AUTH_ROUTES.LOGIN,
  AUTH_ROUTES.SIGNUP,
  AUTH_ROUTES.FORGOT_PASSWORD,
  AUTH_ROUTES.RESET_PASSWORD,
  AUTH_ROUTES.AUTH_CONFIRM,
  AUTH_ROUTES.AUTH_CALLBACK,
] as const;

// ========================================
// 검증 규칙 상수
// ========================================

/**
 * 비밀번호 검증 규칙
 */
export const PASSWORD_RULES = {
  MIN_LENGTH: 6,
  REQUIRE_NUMBER: true,
  REQUIRE_SPECIAL_CHAR: true,
} as const;

// ========================================
// 타입 정의
// ========================================

/**
 * 인증 폼 데이터 타입
 */
export type AuthFormData = {
  email: string;
  password: string;
};

/**
 * 인증 에러 타입
 */
export type AuthError = {
  message: string;
  type: "validation" | "auth" | "unknown";
};
