import { z } from 'zod';
import { passwordRules } from './PasswordValidation';
// PERSONAL INFORMATION SCHEMA
export const personalInfoSchema = z.object({
  fname: z
    .string()
    .min(2, {
      message: 'First name should be at least 2 characters long.',
    })
    .max(50, {
      message: 'First name should not exceed 50 characters.',
    }),
  lname: z
    .string()
    .min(2, {
      message: 'Last name should be at least 2 characters long.',
    })
    .max(50, {
      message: 'Last name should not exceed 50 characters.',
    }),
});

// PASSWORD SCHEMA - Using shared validation rules
export const passwordSchema = z
  .object({
    password: passwordRules.reduce((schema, rule) => {
      if (rule.minLength) {
        schema = schema.min(rule.minLength, { message: rule.errorMessage });
      }
      if (rule.regex) {
        schema = schema.regex(rule.regex, { message: rule.errorMessage });
      }
      return schema;
    }, z.string()),
    confirmPassword: z.string(),
  })
  .refine(data => data.password === data.confirmPassword, {
    message: 'Password and confirm password doesn\'t matched.',
    path: ['confirmPassword'], // this will attach the error to confirmPassword
  });

// RESIDENCE SCHEMA
export const residenceSchema = z.object({
  address: z.string().min(3, {
    message: 'Please enter your address.',
  }),
  zipcode: z
    .string()
    .min(5, {
      message: 'Please enter your zipcode.',
    })
    .max(5, { message: 'Zipcode must be 5 digits.' }),
  city: z.string().min(3, {
    message: 'Please enter your city.',
  }),
  state: z.string().min(3, {
    message: 'Please select your state.',
  }),
  mailing_address: z.string().min(3, {
    message: 'Please enter your mailing address.',
  }),
  mailing_zipcode: z.string().min(3, {
    message: 'Please enter your mailing zip code.',
  }),
  mailing_city: z.string().min(3, {
    message: 'Please enter mailing your city.',
  }),
  mailing_state: z.string().min(3, {
    message: 'Please select your mailing state.',
  }),
});

export const personalInformationSchema = z.object({
  fname: z
    .string({
      message: 'First name is required.',
    })
    .min(3, {
      message: 'Please enter your first name.',
    }),
  lname: z
    .string({
      message: 'Last name is required.',
    })
    .min(3, {
      message: 'Please enter your last name.',
    }),

  smsAlerts: z.boolean().optional(),
  address: z.string({ message: 'Address is required.' }).min(3, {
    message: 'Please enter your address.',
  }),
  zipcode: z.string({ message: 'Zipcode is required.' }).min(3, {
    message: 'Please enter your zipcode.',
  }),
  city: z.string({ message: 'City is required.' }).min(3, {
    message: 'Please enter your city.',
  }),
  state: z.string({ message: 'State is required.' }).min(3, {
    message: 'Please select your state.',
  }),
  mailing_address: z.string({ message: 'Mailing address is required' }).min(3, {
    message: 'Please enter your mailing address.',
  }),
  mailing_zipcode: z
    .string({ message: 'Mailing zipcode is required.' })
    .min(3, {
      message: 'Please enter your mailing zip code.',
    }),
  mailing_city: z.string({ message: 'Mailing city is required.' }).min(3, {
    message: 'Please enter your mailing city.',
  }),
  mailing_state: z.string({ message: 'Mailing state is required.' }).min(3, {
    message: 'Please select your mailing state.',
  }),
  dob: z
    .date({
      message: 'Please enter your date of birth.',
    })
    .refine(
      value => {
        // Custom validation logic for date of birth
        const currentDate = new Date();
        const inputDate = new Date(value);

        // Validate that date of birth is in the past
        return inputDate < currentDate;
      },
      {
        message: 'Date of birth must be in the past.',
      }
    ),
  ssn: z
    .string({
      message: 'Please enter a valid SSN.',
    })
    .min(9, {
      message: 'Please enter a valid SSN.',
    }),
});

export interface PersonalInfoFormFields {
  fname: string;
  lname: string;
  ssn: string;
  dob: Date;
  mailing_address: string;
  mailing_zipcode: string;
  mailing_city: string;
  mailing_state: string;
  address: string;
  zipcode: string;
  city: string;
  state: string;
}
