// ISignUpGenericForm.ts

export interface ISignUpForm {
  civility: 'M.' | 'MME' | 'Autre' | null;

  first_name: string;
  last_name: string;
  nickname: string; 
  birthday: string;

  password: string;
  password_confirmation: string;
  agreeTerms: boolean;

  email: string | null;
  phone: string | null;
}

export const signUpFormRules = (t: (key: string) => string) => ({
  civility: [
    (v: any) => !!v || t('general.signUp.rules.civility.required'),
    (v: any) =>
      ['M.', 'MME', 'Autre'].includes(v) ||
      t('general.signUp.rules.civility.invalid'),
  ],

  first_name: [
    (v: any) => !!v || t('general.signUp.rules.first_name.required'),

    (v: any) => !v || v.length >= 2 || t('general.signUp.rules.first_name.min'),

    (v: any) => !v || v.length <= 255 || t('general.signUp.rules.first_name.max'),

    // uniquement lettres, espaces, tirets
    (v: any) =>
      !v ||
      /^[A-Za-zÀ-ÖØ-öø-ÿ\s'-]+$/.test(v) ||
      t('general.signUp.rules.first_name.invalidCharacters'),
  ],

  last_name: [
    (v: any) => !!v || t('general.signUp.rules.last_name.required'),

    (v: any) => !v || v.length >= 2 || t('general.signUp.rules.last_name.min'),

    (v: any) => !v || v.length <= 255 || t('general.signUp.rules.last_name.max'),

    // uniquement lettres, espaces, tirets
    (v: any) =>
      !v ||
      /^[A-Za-zÀ-ÖØ-öø-ÿ\s'-]+$/.test(v) ||
      t('general.signUp.rules.last_name.invalidCharacters'),
  ],

  nickname: [
    (v: any) => !!v || t('general.signUp.rules.nickname.required'),

    (v: any) => !v || v.length >= 4 || t('general.signUp.rules.nickname.min'),

    (v: any) => !v || v.length <= 16 || t('general.signUp.rules.nickname.max'),

    // commence uniquement par une lettre
    (v: any) => !v || /^[A-Za-z]/.test(v) || t('general.signUp.rules.nickname.mustStartWithLetter'),

    (v: any) =>
      !v ||
      /^[A-Za-z](?:[A-Za-z0-9]|[._](?=[A-Za-z0-9])){3,15}$/.test(v) ||
      t('general.signUp.rules.nickname.invalidFormat'),
  ],

  birthday: [
    (v: any) => !!v || t('general.signUp.rules.birthday.required'),
    (v: any) => {
      if (!v) return false;

      const birth = new Date(v);
      if (isNaN(birth.getTime())) return false;

      const today = new Date();
      const age = today.getFullYear() - birth.getFullYear();

      const hasHadBirthdayThisYear =
        today.getMonth() > birth.getMonth() ||
        (today.getMonth() === birth.getMonth() && today.getDate() >= birth.getDate());

      const realAge = hasHadBirthdayThisYear ? age : age - 1;

      return realAge >= 15 || t('general.signUp.rules.birthday.minAge');
    }
  ],

  password: [
    (v: any) => !!v || t('general.signUp.rules.password.required'),

    (v: any) => !v || v.length >= 8 || t('general.signUp.rules.password.min'),

    (v: any) => !v || v.length <= 128 || t('general.signUp.rules.password.max'),

    // au moins une lettre
    (v: any) =>
      !v || /[A-Za-z]/.test(v) || t('general.signUp.rules.password.mustContainLetter'),

    // au moins un chiffre
    (v: any) =>
      !v || /\d/.test(v) || t('general.signUp.rules.password.mustContainNumber'),

    // au moins un caractère spécial
    (v: any) =>
      !v || /[^A-Za-z0-9]/.test(v) || t('general.signUp.rules.password.mustContainSpecial'),

    // caractères valides (ASCII imprimables)
    (v: any) =>
      !v || /^[\x20-\x7E]+$/.test(v) || t('general.signUp.rules.password.invalidCharacters'),
  ],

  password_confirmation: [
    (v: any) => !!v || t('general.signUp.rules.password_confirmation.required')
  ],

  agreeTerms: [
    (v: any) => v === true || t('general.signUp.rules.agreeTerms.required'),
  ],

  email: [
    (v: any) => !!v || t('general.signUp.rules.email.required'),
    (v: any) =>
      /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v) ||
      t('general.signUp.rules.email.format'),
  ],

  phone: [
    (v: any) => !!v || t('general.signUp.rules.phone.required'),
    (v: any) =>
      typeof v === 'string' && v.length <= 20 ||
      t('general.signUp.rules.phone.max'),
  ],
});