import { z } from "zod";
import { PASSWORD_RULES } from "@/features/auth/constants";

const passwordSchema = z
  .string()
  .min(PASSWORD_RULES.MIN_LENGTH, {
    message: `비밀번호는 최소 ${PASSWORD_RULES.MIN_LENGTH}자 이상이어야 합니다.`,
  })
  .regex(/[A-Z]/, {
    message: "대문자를 최소 1개 이상 포함해야 합니다.",
  })
  .regex(/[a-z]/, {
    message: "소문자를 최소 1개 이상 포함해야 합니다.",
  })
  .regex(/[0-9]/, {
    message: "숫자를 최소 1개 이상 포함해야 합니다.",
  })
  .regex(/[!@#$%^&*(),.?":{}|<>]/, {
    message: "특수문자를 최소 1개 이상 포함해야 합니다.",
  });

export const signupSchema = z
  .object({
    email: z
      .string()
      .min(1, { message: "이메일을 입력해 주세요." })
      .email({ message: "유효한 이메일 형식이 아닙니다." }),
    password: passwordSchema,
    confirmPassword: z
      .string()
      .min(1, { message: "비밀번호 확인을 입력해 주세요." }),
  })
  .refine((data) => data.password === data.confirmPassword, {
    message: "비밀번호가 일치하지 않습니다.",
    path: ["confirmPassword"],
  });

export const resetPasswordSchema = z
  .object({
    password: passwordSchema,
    confirmPassword: z
      .string()
      .min(1, { message: "비밀번호 확인을 입력해 주세요." }),
  })
  .refine((data) => data.password === data.confirmPassword, {
    message: "비밀번호가 일치하지 않습니다.",
    path: ["confirmPassword"],
  });

export const loginSchema = z.object({
  email: z
    .string()
    .min(1, { message: "이메일을 입력해 주세요." })
    .email({ message: "유효한 이메일 형식이 아닙니다." }),
  password: z.string().min(1, { message: "비밀번호를 입력해 주세요." }),
  rememberMe: z.boolean().optional(),
});

export const forgotPasswordSchema = z.object({
  email: z
    .string()
    .min(1, { message: "이메일을 입력해 주세요." })
    .email({ message: "유효한 이메일 형식이 아닙니다." }),
});

export type SignupFormData = z.infer<typeof signupSchema>;
export type ResetPasswordFormData = z.infer<typeof resetPasswordSchema>;
export type LoginFormData = z.infer<typeof loginSchema>;
export type ForgotPasswordFormData = z.infer<typeof forgotPasswordSchema>;
