import { z, ZodObject } from "zod";

const phoneMessage = "Ingresa un número válido de 9 dígitos";
const requiredMessage = "Completa este campo";
const comunaMessage = "Selecciona una comuna";
const maxMessage = (num: string) => `El máximo de caracteres es de ${num}.`;
const phoneValidation = z
  .string()
  .trim()
  .max(9, phoneMessage)
  .min(9, phoneMessage)
  .regex(/^\d*$/, "Ingresa solo números.");

const planSchema = {
  nombre: z.string().trim().min(1, requiredMessage).max(255, maxMessage("255")),
  apellido: z.string().trim().min(1, requiredMessage).max(255, maxMessage("255")),
  telefono: phoneValidation,
  correo_electronico: z.string().trim().email("Ingresa un correo electrónico válido.").max(255, maxMessage("255")),
  run: z.string().trim().min(12, "Ingresa un número válido"),
};

export const planVial365BaseSchema = z.object({
  ...planSchema,
  placa_patente: z.string().trim().min(1, requiredMessage).max(10, maxMessage("10")),
});
export const planVial365PlusSchema = z.object({
  ...planSchema,
  placa_patente: z.string().trim().min(1, requiredMessage).max(10, maxMessage("10")),
});
export const planHogar365Schema = z.object({
  ...planSchema,
  domicilio: z.string().trim().min(1, requiredMessage).max(255, maxMessage("255")),
  comuna: z.string({ message: comunaMessage }).min(1, comunaMessage),
});
export const planMedi365Schema = z.object({
  ...planSchema,
  fecha_nacimiento: z
    .string()
    .trim()
    .min(1, requiredMessage)
    .refine((value) => {
      const year = Number(value.split("-")[0]);
      return year >= 1900 && year <= new Date().getFullYear();
    }, "Ingresa una fecha de nacimiento válida.")
    .refine((value) => {
      let age = new Date().getFullYear() - new Date(value).getFullYear();
      const month = new Date().getMonth() - new Date(value).getMonth();

      if (month < 0 || (month === 0 && new Date().getDate() < new Date(value).getDate())) {
        age--;
      }
      return age > 18;
    }, "Debes ser mayor de 18 años para adquirir el servicio."),
  genero: z.enum(["F", "M", ""], { message: "Selecciona masculino o femenino" }),
});

export const telSchema = z.object({
  telefono: phoneValidation,
});

export const planSchemas: { [x: string]: ZodObject<typeof planSchema> } = {
  Vial365Base: planVial365BaseSchema,
  Vial365Plus: planVial365PlusSchema,
  Hogar365: planHogar365Schema,
  Medi365: planMedi365Schema,
};

export type TtelSchema = z.infer<typeof telSchema>;
export type TplanVial365BaseSchema = z.infer<typeof planVial365BaseSchema>;
export type TplanVial365PlusSchema = z.infer<typeof planVial365PlusSchema>;
export type TplanHogar365Schema = z.infer<typeof planHogar365Schema>;
export type TplanMedi365Schema = z.infer<typeof planMedi365Schema>;
export type TPlanInputValues =
  | TplanVial365BaseSchema
  | TplanVial365PlusSchema
  | TplanMedi365Schema
  | TplanHogar365Schema;
