import { z } from 'zod';
import { isValidPhoneNumber } from 'react-phone-number-input';

/**
 * Options et schéma du formulaire /diagnostic.
 *
 * IMPORTANT : les `value` ci-dessous sont les **valeurs internes EXACTES** des propriétés HubSpot du client
 * (cf. scripts/hubspot/setup.mjs). Les `label` sont les libellés affichés (formulaire client). Ainsi le front
 * envoie directement les valeurs internes attendues par HubSpot, sans table de correspondance.
 */

// profil (select, requis) — libellé affiché vs valeur interne client
export const profils = [
  { value: 'Professionnel', label: 'Professionnel' },
  { value: 'Applicateur', label: 'Artisan / Professionnel du BTP' },
  { value: 'Territoire', label: 'Territoire' },
  { value: "Bureau d'étude", label: "Architecte - Bureau d'étude" },
  { value: 'Particulier', label: 'Particulier' },
] as const;

// enjeux (cases à cocher, requis ≥ 1)
export const enjeux = [
  { value: 'Diminuer conso climatisation', label: "Réduire la consommation d'énergie" },
  { value: 'Bien-être du personnel', label: 'Bien-être des occupants' },
  { value: 'Rafraîchir son bâtiment', label: 'Rafraîchir son bâtiment' },
  { value: 'Protection des matières premières ou produits finis', label: 'Protéger des marchandises' },
  { value: 'Prolonger la durée de vie de sa toiture', label: 'Prolonger la durée de vie de sa toiture' },
  { value: 'Se conformer au décret tertiaire', label: 'Conformité réglementaire' },
  { value: "Renforcer l'étanchéité", label: "Renforcer l'étanchéité" },
] as const;

// type_de_revetement (cases à cocher, optionnel)
export const typesRevetement = [
  { value: 'Membrane bitume', label: 'Membrane bitume' },
  { value: 'Bac acier', label: 'Bac acier' },
  { value: 'Acier galvanisé', label: 'Acier galvanisé' },
  { value: 'Zinc', label: 'Zinc' },
  { value: 'EPDM', label: 'EPDM (+ de 10 ans)' },
  { value: 'Membrane pvc', label: 'Membrane PVC (+ de 10 ans)' },
  { value: 'Polycarbonate / Fibre de verre', label: 'Polycarbonate / Fibre de verre' },
  { value: 'Verre', label: 'Verre' },
  { value: 'Béton', label: 'Béton' },
  { value: 'Tuiles béton', label: 'Tuiles béton' },
  { value: 'Ardoises', label: 'Ardoises' },
  { value: 'Fibrociment', label: 'Fibrociment' },
  { value: 'Etanchéité liquide (SEL)', label: 'Etanchéité liquide (SEL)' },
] as const;

// prestation_souhaitee (cases à cocher, optionnel)
export const prestations = [
  { value: 'Fourniture et installation', label: 'Fourniture et installation' },
  { value: 'Acheter uniquement le produit', label: 'Acheter le produit' },
] as const;

export const surfaceQuickChips = [500, 2000, 5000, 10000] as const;

const enjeuxValues = enjeux.map((e) => e.value) as [string, ...string[]];
const profilValues = profils.map((p) => p.value) as [string, ...string[]];

export const diagnosticSchema = z.object({
  // Identité / contact
  email: z.string().email('Email invalide'),
  firstName: z.string().min(2, 'Prénom requis'),
  lastName: z.string().min(2, 'Nom requis'),
  company: z.string().optional(),
  // Téléphone au format E.164 (ex : +33612345678), validé selon le pays
  phone: z
    .string()
    .min(1, 'Téléphone requis')
    .refine((v) => isValidPhoneNumber(v), 'Numéro de téléphone invalide'),
  profil: z.enum(profilValues, { errorMap: () => ({ message: 'Sélectionnez votre profil' }) }),
  city: z.string().optional(),
  // Code postal optionnel et permissif (international)
  postalCode: z.string().optional(),
  country: z.string().optional(),

  // Besoin / projet
  enjeux: z.array(z.enum(enjeuxValues)).min(1, 'Choisissez au moins un enjeu'),
  typeRevetement: z.array(z.string()).optional(),
  superficie: z
    .number({ invalid_type_error: 'Entrez une surface en m²' })
    .int()
    .positive()
    .max(1_000_000, 'Surface trop grande')
    .optional(),
  prestation: z.array(z.string()).optional(),

  // Message + consentement
  message: z.string().max(1500, '1500 caractères maximum').optional(),
  rgpd: z.boolean().refine((v) => v === true, {
    message: 'Consentement requis pour traiter votre demande',
  }),
  newsletter: z.boolean().optional(),
});

export type DiagnosticFormValues = z.infer<typeof diagnosticSchema>;

export const diagnosticDefaultValues: Partial<DiagnosticFormValues> = {
  email: '',
  firstName: '',
  lastName: '',
  company: '',
  phone: '',
  profil: undefined,
  city: '',
  postalCode: '',
  country: '',
  enjeux: [],
  typeRevetement: [],
  superficie: undefined,
  prestation: [],
  message: '',
  rgpd: false,
  newsletter: false,
};

const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

// Bloc 1 « Votre besoin » : au moins un enjeu choisi.
export const isBlock1Filled = (v: Partial<DiagnosticFormValues>): boolean =>
  Array.isArray(v.enjeux) && v.enjeux.length >= 1;

// Bloc 2 « Vous » : champs requis du contact valides.
export const isBlock2Filled = (v: Partial<DiagnosticFormValues>): boolean =>
  !!v.profil &&
  !!v.firstName &&
  v.firstName.trim().length >= 2 &&
  !!v.lastName &&
  v.lastName.trim().length >= 2 &&
  !!v.email &&
  emailRegex.test(v.email) &&
  !!v.phone &&
  isValidPhoneNumber(v.phone);

// Libellés humains (clé RHF → libellé affiché) pour les messages d'erreur exhaustifs.
export const fieldLabels: Record<string, string> = {
  email: 'E-mail professionnel',
  firstName: 'Prénom',
  lastName: 'Nom',
  company: "Nom de l'entreprise",
  phone: 'Numéro de téléphone',
  profil: 'Profil',
  city: 'Ville',
  postalCode: 'Code postal',
  country: 'Pays/Région',
  enjeux: 'Vos enjeux',
  typeRevetement: 'Type de revêtement',
  superficie: 'Superficie à traiter',
  prestation: 'Prestation souhaitée',
  message: 'Message',
  rgpd: 'Consentement (case à cocher)',
  newsletter: 'Newsletter',
};
