import * as z from 'zod'
import { AuthType } from '@/types/auth'

// ─── Login Schema ─────────────────────────────────────────────────────────────

export const loginSchema = z
  .object({
    identifier: z.string().min(1, { message: 'auth.validation.identifierRequired' }),
    authType: z.enum([AuthType.PASSWORD, AuthType.OTP]),
    password: z
      .string()
      .optional(),
    otpCode: z
      .string()
      .optional(),
  })
  .superRefine((data, ctx) => {
    if (data.authType === AuthType.PASSWORD) {
      if (!data.password || data.password.trim() === '') {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          path: ['password'],
          message: 'auth.validation.passwordRequired',
        })
      } else if (data.password.length < 6) {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          path: ['password'],
          message: 'auth.validation.passwordMin',
        })
      }
    }
    if (data.authType === AuthType.OTP) {
      if (!data.otpCode || data.otpCode.trim() === '') {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          path: ['otpCode'],
          message: 'auth.validation.otpRequired',
        })
      } else if (data.otpCode.length !== 6) {
        ctx.addIssue({
          code: z.ZodIssueCode.custom,
          path: ['otpCode'],
          message: 'auth.validation.otpLength',
        })
      }
    }
  })

export type LoginFormValues = z.infer<typeof loginSchema>

// ─── Forgot Password — Step 1 Schema ─────────────────────────────────────────

export const forgotPasswordSchema = z.object({
  identifier: z.string().min(1, { message: 'auth.validation.identifierRequired' }),
})

export type ForgotPasswordFormValues = z.infer<typeof forgotPasswordSchema>

// ─── Reset Password — Step 2 Schema ──────────────────────────────────────────

export const resetPasswordSchema = z
  .object({
    otpCode: z
      .string()
      .length(6, { message: 'auth.validation.otpLength' }),
    newPassword: z
      .string()
      .min(6, { message: 'auth.validation.passwordMin' }),
    confirmPassword: z.string().min(1, { message: 'auth.validation.confirmPasswordRequired' }),
  })
  .refine((data) => data.newPassword === data.confirmPassword, {
    message: 'auth.validation.passwordMismatch',
    path: ['confirmPassword'],
  })

export type ResetPasswordFormValues = z.infer<typeof resetPasswordSchema>
