// flow-config.jsx — Definition of all steps (personal + risk-specific)

// ─────────────────────────────────────────────────────────────
// Validators
// ─────────────────────────────────────────────────────────────
const V = {
  required: (v) => {
    if (v === null || v === undefined) return 'Completá este dato';
    if (typeof v === 'string' && !v.trim()) return 'Completá este dato';
    if (Array.isArray(v) && v.length === 0) return 'Seleccioná al menos una opción';
    return null;
  },
  dniCuil: (v) => {
    const n = (v || '').replace(/\D/g, '');
    if (!n) return 'Completá este dato';
    if (n.length !== 8 && n.length !== 11) return 'Deben ser 8 dígitos (DNI) u 11 (CUIL/CUIT)';
    if (/^(.)\1+$/.test(n)) return 'Número inválido';
    if (n.length === 11) return V._cuitChecksum(n);
    return null;
  },
  cuit: (v) => {
    const n = (v || '').replace(/\D/g, '');
    if (!n) return 'Completá este dato';
    if (n.length !== 11) return 'El CUIT debe tener 11 dígitos';
    return V._cuitChecksum(n);
  },
  _cuitChecksum: (n) => {
    const mult = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
    const sum = mult.reduce((acc, m, i) => acc + m * parseInt(n[i], 10), 0);
    const rem = sum % 11;
    const check = rem === 0 ? 0 : rem === 1 ? 9 : 11 - rem;
    if (parseInt(n[10], 10) !== check) return 'CUIT inválido (dígito verificador incorrecto)';
    return null;
  },
  email: (v) => {
    if (!v) return 'Completá este dato';
    if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)) return 'Email inválido';
    return null;
  },
  phoneAr: (v) => {
    const n = (v || '').replace(/\D/g, '');
    if (!n) return 'Completá este dato';
    if (n.length < 10) return 'Ingresá el código de área y número (min. 10 dígitos)';
    return null;
  },
  age18: (v) => {
    if (!v) return 'Completá la fecha';
    const d = new Date(v);
    if (isNaN(d)) return 'Fecha inválida';
    const diff = (Date.now() - d.getTime()) / (1000 * 60 * 60 * 24 * 365.25);
    if (diff < 18) return 'Tenés que ser mayor de 18';
    if (diff > 110) return 'Verificá la fecha';
    return null;
  },
  plate: (v) => {
    if (!v) return 'Completá la patente';
    const s = v.replace(/\s|-/g, '').toUpperCase();
    if (!/^([A-Z]{3}\d{3}|[A-Z]{2}\d{3}[A-Z]{2})$/.test(s)) {
      return 'Formato: ABC123 o AB123CD';
    }
    return null;
  },
  notJunk: (v) => {
    if (!v) return 'Completá este dato';
    const s = v.toString().trim();
    if (s.length < 2) return 'Muy corto, completá bien';
    if (/^(.)\1+$/.test(s)) return 'Completá un dato válido';
    if (/^(12345|abcde|asdf|qwer)/i.test(s)) return 'Completá un dato válido';
    return null;
  },
  positiveNum: (v) => {
    if (!v) return 'Completá este dato';
    const n = parseFloat(v.toString().replace(/[^\d.,]/g, '').replace(',', '.'));
    if (!n || n <= 0) return 'Debe ser un número positivo';
    return null;
  },
};

// ─────────────────────────────────────────────────────────────
// Personal steps (first phase)
// ─────────────────────────────────────────────────────────────
const PERSONAL_STEPS = [
  {
    id: 'nombre',
    kind: 'text',
    title: '¿Cómo te llamás?',
    subtitle: 'Nombre y apellido, o razón social si sos empresa.',
    placeholder: 'Ej: Juan Pérez / Distribuidora S.A.',
    validate: V.notJunk,
  },
  {
    id: 'dni',
    kind: 'text',
    title: 'Tu DNI, CUIL o CUIT',
    subtitle: '8 dígitos para DNI, 11 para CUIL/CUIT.',
    inputMode: 'numeric',
    placeholder: '20123456 o 20201234561',
    maxLength: 13,
    validate: V.dniCuil,
  },
  {
    id: 'nacimiento',
    kind: 'date',
    title: 'Fecha de nacimiento',
    subtitle: 'Dato clave para calcular la prima.',
    validate: V.age18,
  },
  {
    id: 'domicilio',
    kind: 'address',
    title: 'Tu domicilio',
    subtitle: 'Calle, número y, si corresponde, piso o depto.',
  },
  {
    id: 'localidad',
    kind: 'locality',
    title: 'Localidad y código postal',
  },
  {
    id: 'contacto',
    kind: 'contact',
    title: 'Dejanos tu contacto',
    subtitle: 'Te vamos a escribir por acá apenas tengamos la cotización.',
  },
  {
    id: 'descuento',
    kind: 'discount-upload',
    title: 'Ganate un 5% de descuento',
    subtitle: 'Subí tu póliza actual, DNI, F931 o recibo. Es opcional, pero te baja la prima.',
  },
];

// ─────────────────────────────────────────────────────────────
// Risk category picker
// ─────────────────────────────────────────────────────────────
const RISK_CATEGORIES = [
  { value: 'auto',       label: 'Auto / Moto',      icon: '🚗', hint: 'Terceros, todo riesgo' },
  { value: 'hogar',      label: 'Hogar',            icon: '🏠', hint: 'Incendio, robo, contenido' },
  { value: 'comercio',   label: 'Comercio',         icon: '🏬', hint: 'Integral, consorcio' },
  { value: 'art',        label: 'ART',              icon: '👷', hint: 'Empleados' },
  { value: 'ap',         label: 'Accidentes Pers.', icon: '🩹', hint: 'AP / obra / consorcio' },
  { value: 'caucion',    label: 'Caución',          icon: '📜', hint: 'Alquiler, obra' },
  { value: 'bici',       label: 'Bici / Drone',     icon: '🚴', hint: 'Monopatín, drones' },
  { value: 'celular',    label: 'Celular',          icon: '📱', hint: 'Robo, rotura' },
  { value: 'bolso',      label: 'Bolso Protegido',  icon: '👜', hint: 'Contenido en tránsito' },
  { value: 'viajero',    label: 'Asist. al Viajero',icon: '✈️', hint: 'Destino y fechas' },
  { value: 'sepelio',    label: 'Sepelio',          icon: '🕊️', hint: 'Prestacional/dinerario' },
  { value: 'prepaga',    label: 'Prepaga / Salud',  icon: '💊', hint: 'Cotización cruzada' },
  { value: 'vida',       label: 'Vida / Retiro',    icon: '🛡️', hint: 'Protección y ahorro' },
];

// ─────────────────────────────────────────────────────────────
// Risk-specific step definitions
// Each risk is an array of step objects.
// ─────────────────────────────────────────────────────────────
const RISK_FLOWS = {
  auto: [
    { id: 'auto_tipo', kind: 'options', title: '¿Auto o moto?',
      options: [
        { value: 'auto', label: 'Auto', icon: '🚗' },
        { value: 'moto', label: 'Moto', icon: '🏍️' },
      ], validate: V.required },
    { id: 'auto_patente', kind: 'text', title: 'Patente', placeholder: 'ABC123 o AB123CD',
      hint: 'Formato nuevo o viejo, con o sin guión.', validate: V.plate,
      transform: (v) => v.toUpperCase().replace(/\s/g, '') },
    { id: 'auto_anio', kind: 'text', title: 'Año', placeholder: '2022',
      inputMode: 'numeric', maxLength: 4, validate: (v) => {
        const n = parseInt(v, 10);
        if (!n || n < 1950 || n > new Date().getFullYear() + 1) return 'Año inválido';
        return null;
      } },
    { id: 'auto_marca_modelo', kind: 'text', title: 'Marca y modelo',
      subtitle: 'Lo más exacto posible — versión y motor.',
      placeholder: 'Ej: Ford Fiesta 1.6 S', validate: V.notJunk },
    { id: 'auto_detalles', kind: 'auto-details', title: 'Detalles técnicos' },
    { id: 'auto_equipamiento', kind: 'auto-equip', title: 'Equipamiento' },
    { id: 'auto_fotos', kind: 'files', title: 'Fotos del vehículo',
      subtitle: 'Frente, atrás, ambos laterales y velocímetro. Patente visible, sin recortes.',
      accept: 'image/*', multiple: true, icon: '📸', optional: true },
  ],

  hogar: [
    { id: 'hogar_tipo', kind: 'options', title: 'Tipo de vivienda',
      options: [
        { value: 'casa', label: 'Casa', icon: '🏡' },
        { value: 'depto', label: 'Departamento', icon: '🏢' },
        { value: 'ph', label: 'PH', icon: '🏘️' },
        { value: 'otro', label: 'Otro', icon: '🔑' },
      ], validate: V.required },
    { id: 'hogar_m2', kind: 'home-m2', title: 'Metros de la vivienda' },
    { id: 'hogar_seguridad', kind: 'multi', title: 'Medidas de seguridad',
      subtitle: 'Seleccioná todas las que tenga.',
      options: [
        { value: 'cerradura', label: 'Cerradura de seguridad' },
        { value: 'rejas', label: 'Rejas' },
        { value: 'alarma', label: 'Alarma' },
        { value: 'camara', label: 'Cámara de seguridad' },
        { value: 'blindex', label: 'Puerta blindada' },
      ]},
    { id: 'hogar_contenido', kind: 'text', title: 'Valor estimado del contenido',
      subtitle: 'Muebles y electrodomésticos.',
      prefix: '$', inputMode: 'numeric', placeholder: '0', validate: V.positiveNum },
  ],

  comercio: [
    { id: 'com_actividad', kind: 'text', title: 'Actividad del comercio',
      placeholder: 'Ej: panadería, ropa, restaurante, supermercado',
      validate: V.notJunk },
    { id: 'com_direccion', kind: 'text', title: 'Dirección exacta del riesgo',
      placeholder: 'Calle, número, localidad', validate: V.notJunk },
    { id: 'com_m2', kind: 'text', title: 'Metros cuadrados',
      inputMode: 'numeric', suffix: 'm²', validate: V.positiveNum },
    { id: 'com_carteles', kind: 'yesno', title: '¿Tiene carteles exteriores?' },
    { id: 'com_seguridad', kind: 'multi', title: 'Medidas de seguridad',
      options: [
        { value: 'alarma', label: 'Alarma' },
        { value: 'persiana', label: 'Persiana metálica' },
        { value: 'rejas', label: 'Rejas' },
        { value: 'camara', label: 'Cámaras' },
      ]},
    { id: 'com_mercaderia', kind: 'text', title: 'Monto aproximado de mercadería',
      prefix: '$', inputMode: 'numeric', validate: V.positiveNum },
  ],

  art: [
    { id: 'art_cuit', kind: 'text', title: 'CUIT del empleador',
      inputMode: 'numeric', maxLength: 13, validate: V.cuit },
    { id: 'art_actividad', kind: 'text', title: 'Actividad (CIIU)',
      subtitle: 'Rubro o código de actividad.',
      placeholder: 'Ej: Construcción, 4520', validate: V.notJunk },
    { id: 'art_masa', kind: 'text', title: 'Masa salarial mensual',
      prefix: '$', inputMode: 'numeric', validate: V.positiveNum },
    { id: 'art_capitas', kind: 'text', title: 'Cantidad de empleados (cápitas)',
      inputMode: 'numeric', validate: V.positiveNum },
    { id: 'art_f931', kind: 'file', title: 'Subí el formulario F931',
      subtitle: 'Opcional pero acelera la cotización.',
      accept: '.pdf,image/*', icon: '📄', optional: true },
  ],

  ap: [
    { id: 'ap_actividad', kind: 'text', title: 'Actividad exacta',
      placeholder: 'Ej: albañil, pintor, electricista',
      validate: V.notJunk },
    { id: 'ap_destino', kind: 'options', title: '¿Para qué se necesita?',
      options: [
        { value: 'obra', label: 'Ingreso a obra' },
        { value: 'consorcio', label: 'Ingreso a consorcio' },
        { value: 'general', label: 'Cobertura general' },
      ], validate: V.required },
    { id: 'ap_personas', kind: 'text', title: 'Cantidad de personas a cubrir',
      inputMode: 'numeric', validate: V.positiveNum },
    { id: 'ap_no_repeticion', kind: 'yesno', title: '¿Requiere cláusula de No Repetición?' },
    { id: 'ap_no_rep_detalle', kind: 'ap-norep', title: 'Datos de la cláusula',
      subtitle: 'CUIT y suma asegurada de quien la solicita.',
      showIf: (d) => d.ap_no_repeticion === 'si' },
  ],

  caucion: [
    { id: 'cau_tipo', kind: 'options', title: 'Tipo de contrato',
      options: [
        { value: 'alq_part', label: 'Alquiler particular' },
        { value: 'alq_com', label: 'Alquiler comercial' },
        { value: 'obra', label: 'Obra / suministro' },
        { value: 'otro', label: 'Otro' },
      ], validate: V.required },
    { id: 'cau_monto', kind: 'text', title: 'Monto del contrato',
      prefix: '$', inputMode: 'numeric', validate: V.positiveNum },
    { id: 'cau_cuit', kind: 'text', title: 'CUIT del tomador',
      inputMode: 'numeric', maxLength: 13, validate: V.cuit },
    { id: 'cau_garantes', kind: 'textarea', title: 'Datos de 2 garantes',
      subtitle: 'Nombre, DNI y relación de cada uno.',
      placeholder: 'Garante 1: ...\nGarante 2: ...', validate: V.notJunk },
    { id: 'cau_recibo', kind: 'file', title: 'Subí el recibo de sueldo',
      accept: '.pdf,image/*', icon: '💰', optional: true },
  ],

  bici: [
    { id: 'bici_tipo', kind: 'options', title: '¿Qué vas a asegurar?',
      options: [
        { value: 'bici', label: 'Bicicleta', icon: '🚲' },
        { value: 'mono', label: 'Monopatín', icon: '🛴' },
        { value: 'drone', label: 'Drone', icon: '🛸' },
      ], validate: V.required },
    { id: 'bici_marca_modelo', kind: 'text', title: 'Marca y modelo',
      placeholder: 'Ej: Trek Marlin 7', validate: V.notJunk },
    { id: 'bici_anio', kind: 'text', title: 'Año', inputMode: 'numeric', maxLength: 4, validate: V.notJunk },
    { id: 'bici_suma', kind: 'text', title: 'Suma asegurada',
      subtitle: 'Valor de mercado.', prefix: '$', inputMode: 'numeric', validate: V.positiveNum },
    { id: 'bici_laboral', kind: 'yesno', title: '¿Uso laboral (delivery)?' },
    { id: 'bici_factura', kind: 'file', title: 'Factura de compra',
      subtitle: 'Si la tenés, subila — sirve para el alta.',
      accept: '.pdf,image/*', icon: '🧾', optional: true },
  ],

  celular: [
    { id: 'cel_marca', kind: 'text', title: 'Marca y modelo exacto',
      placeholder: 'Ej: iPhone 14 Pro 256GB', validate: V.notJunk },
    { id: 'cel_valor', kind: 'text', title: 'Valor de compra',
      prefix: '$', inputMode: 'numeric', validate: V.positiveNum },
    { id: 'cel_foto', kind: 'file', title: 'Foto de la pantalla encendida',
      subtitle: 'Tiene que verse el equipo prendido, sin roturas.',
      accept: 'image/*', icon: '📸', optional: true },
    { id: 'cel_factura', kind: 'file', title: 'Factura de compra',
      subtitle: 'Opcional pero muy recomendada.',
      accept: '.pdf,image/*', icon: '🧾', optional: true },
  ],

  bolso: [
    { id: 'bolso_suma', kind: 'text', title: 'Suma asegurada',
      subtitle: 'Valor total de lo que solés llevar (notebook, documentos, etc.)',
      prefix: '$', inputMode: 'numeric', validate: V.positiveNum },
    { id: 'bolso_detalle', kind: 'textarea', title: '¿Qué llevás habitualmente?',
      placeholder: 'Notebook, auriculares, documentos, llaves...',
      validate: V.notJunk, optional: true },
  ],

  viajero: [
    { id: 'via_destino', kind: 'text', title: 'Destino',
      placeholder: 'Ej: Brasil, Europa', validate: V.notJunk },
    { id: 'via_fechas', kind: 'travel-dates', title: 'Fechas del viaje' },
    { id: 'via_cant', kind: 'text', title: 'Cantidad de pasajeros',
      inputMode: 'numeric', validate: V.positiveNum },
    { id: 'via_edades', kind: 'text', title: 'Edades de los pasajeros',
      placeholder: 'Ej: 34, 32, 5, 2', validate: V.notJunk },
    { id: 'via_preexistencias', kind: 'travel-pre', title: 'Embarazos o preexistencias' },
  ],

  sepelio: [
    { id: 'sep_apellido', kind: 'text', title: 'Apellido del titular', validate: V.notJunk },
    { id: 'sep_nombre', kind: 'text', title: 'Nombre', validate: V.notJunk },
    { id: 'sep_dni', kind: 'text', title: 'DNI', inputMode: 'numeric', maxLength: 9, validate: V.dniCuil },
    { id: 'sep_nacimiento', kind: 'date', title: 'Fecha de nacimiento', validate: V.required },
    { id: 'sep_modalidad', kind: 'options', title: 'Modalidad',
      options: [
        { value: 'prestacional', label: 'Prestacional', desc: 'Servicio completo' },
        { value: 'dinerario', label: 'Dinerario', desc: 'Reintegro en $' },
      ], validate: V.required },
  ],

  prepaga: [
    { id: 'pre_familia', kind: 'textarea', title: 'Composición familiar',
      subtitle: 'Edades de todos los integrantes a cubrir.',
      placeholder: 'Titular 38, esposa 35, hija 6, hijo 3', validate: V.notJunk },
    { id: 'pre_actual', kind: 'text', title: 'Obra social o prepaga actual',
      placeholder: 'Ej: OSDE, Swiss, ninguna', validate: V.notJunk },
    { id: 'pre_situacion', kind: 'options', title: 'Situación laboral',
      options: [
        { value: 'rel_dep', label: 'Relación de dependencia' },
        { value: 'monotributo', label: 'Monotributo' },
        { value: 'particular', label: 'Particular' },
      ], validate: V.required },
    { id: 'pre_monotributo_cat', kind: 'text', title: 'Categoría de monotributo',
      showIf: (d) => d.pre_situacion === 'monotributo',
      placeholder: 'A, B, C...', validate: V.notJunk },
    { id: 'pre_cotizar', kind: 'multi', title: '¿Dónde querés cotizar?',
      subtitle: 'Podés elegir varias.',
      options: [
        { value: 'swiss', label: 'Swiss Medical' },
        { value: 'galeno', label: 'Galeno' },
        { value: 'prevencion', label: 'Prevención' },
        { value: 'sancor', label: 'Sancor Salud' },
        { value: 'avalian', label: 'Avalian' },
        { value: 'otra', label: 'Otra / Sugerencia del asesor' },
      ], validate: V.required },
  ],

  vida: [
    { id: 'vida_objetivo', kind: 'options', title: '¿Cuál es tu objetivo?',
      options: [
        { value: 'proteccion', label: 'Protección familiar', desc: 'Si me pasa algo' },
        { value: 'retiro', label: 'Ahorro para retiro' },
        { value: 'educacion', label: 'Educación de los hijos' },
        { value: 'mix', label: 'Una combinación' },
      ], validate: V.required },
    { id: 'vida_moneda', kind: 'options', title: 'Moneda',
      options: [
        { value: 'ars', label: 'Pesos (ARS)' },
        { value: 'usd', label: 'Dólares (USD)' },
      ], validate: V.required },
    { id: 'vida_ahorro', kind: 'text', title: 'Capacidad de ahorro mensual',
      subtitle: 'Aproximada, en la moneda elegida.',
      prefix: '$', inputMode: 'numeric', validate: V.positiveNum },
    { id: 'vida_fuma', kind: 'yesno', title: '¿Fumás?' },
  ],
};

Object.assign(window, {
  V, PERSONAL_STEPS, RISK_CATEGORIES, RISK_FLOWS,
});
