import * as yup from 'yup';
import { emailField } from '@/lib/validations/email';

const phoneRegex = /^[\+]?[(]?[0-9]{1,4}[)]?[-\s\.]?[(]?[0-9]{1,4}[)]?[-\s\.]?[0-9]{1,9}$/;

export interface ClientValidationMessages {
  nameRequired: string;
  nameMin: string;
  nameMax: string;
  emailRequired: string;
  emailInvalid: string;
  phoneRequired: string;
  phoneInvalid: string;
  ageRequired: string;
  ageMin: string;
  ageMax: string;
  ageInteger: string;
  genderRequired: string;
  genderInvalid: string;
}

const defaultMessages: ClientValidationMessages = {
  nameRequired: 'Patient name is required',
  nameMin: 'Patient name must be at least 2 characters',
  nameMax: 'Patient name cannot exceed 100 characters',
  emailRequired: 'Email is required',
  emailInvalid: 'Please enter a valid email address',
  phoneRequired: 'Mobile number is required',
  phoneInvalid: 'Please enter a valid phone number',
  ageRequired: 'Age is required',
  ageMin: 'Age must be at least 18',
  ageMax: 'Age must be at most 120',
  ageInteger: 'Age must be a whole number',
  genderRequired: 'Gender is required',
  genderInvalid: 'Please select a valid gender',
};

export const createClientValidationSchema = (messages: ClientValidationMessages = defaultMessages) =>
  yup.object({
    name: yup
      .string()
      .required(messages.nameRequired)
      .trim()
      .min(2, messages.nameMin)
      .max(100, messages.nameMax)
      .test("no-html", "Name cannot contain HTML or script tags", (value) => !/<[^>]*>/.test(value ?? "")),

    email: emailField(messages.emailRequired, messages.emailInvalid),

    phone: yup
      .string()
      .required(messages.phoneRequired)
      .matches(phoneRegex, {
        message: messages.phoneInvalid,
        excludeEmptyString: true,
      }),

    age: yup
      .number()
      .required(messages.ageRequired)
      .typeError(messages.ageRequired)
      .min(18, messages.ageMin)
      .max(120, messages.ageMax)
      .integer(messages.ageInteger),

    gender: yup
      .string()
      .required(messages.genderRequired)
      .oneOf(['Male', 'Female', 'Other'], messages.genderInvalid),
  });

// Backward-compatible static export (English defaults)
export const clientValidationSchema = createClientValidationSchema();

export type ClientFormData = {
  name: string;
  email: string;
  phone: string;
  age: number;
  gender: string;
};
