// audit-page.jsx — Audit Énergétique Conforme : rapport multi-FROST + aperçu + PDF
// Portage de pg-pdf (audits-energies.html) vers design-v1 — règles 2, 3.a, 4, 5

const { useState, useMemo, useCallback, useRef } = React;

/* ─── Constantes ──────────────────────────────────────────────────────────── */
const TAUX = 7.5; // €/MWh cumac

const ZONE_FACTOR = { H1:1.0, H2:0.9, H3:0.8 };

/* ─── Catalogue FROST simplifié pour audit multi-opérations ──────────────── */
// Chaque FROST : { code, label, calc(params, zone) → kWhcumac, params: [{id,label,type,unit,default,min,max}] }
const AUDIT_FOSTS = [
  {
    code:'BAT-TH-139', label:'Récupération chaleur sur groupe froid',
    calc:(p,z)=>{ const km={H1:0.9,H2:0.9,H3:0.9}[z]||0.9; return Math.round(parseFloat(p.pw||100)*3*20*km*(parseFloat(p.eer||3)-1)/parseFloat(p.eer||3)*1000); },
    params:[
      {id:'pw',label:'Puissance frigorigène (kW)',type:'number',unit:'kW',default:100,min:5,max:5000},
      {id:'eer',label:'EER groupe',type:'number',unit:'',default:3.2,min:2,max:7},
    ],
  },
  {
    code:'BAT-TH-134', label:'Régulation HP flottante (froid tertiaire)',
    calc:(p,z)=>{ const kf=ZONE_FACTOR[z]||1; return Math.round(parseFloat(p.pw||100)*parseFloat(p.dur||3600)*0.075*kf); },
    params:[
      {id:'pw',label:'Puissance moteur condenseur (kW)',type:'number',unit:'kW',default:100,min:5,max:2000},
      {id:'dur',label:'Durée annuelle de fonctionnement (h)',type:'number',unit:'h/an',default:3600,min:500,max:8760},
    ],
  },
  {
    code:'BAT-TH-145', label:'Régulation BP flottante (froid tertiaire)',
    calc:(p,z)=>{ const kf=ZONE_FACTOR[z]||1; return Math.round(parseFloat(p.pw||100)*parseFloat(p.dur||3600)*0.055*kf); },
    params:[
      {id:'pw',label:'Puissance moteur compresseur (kW)',type:'number',unit:'kW',default:100,min:5,max:2000},
      {id:'dur',label:'Durée annuelle de fonctionnement (h)',type:'number',unit:'h/an',default:3600,min:500,max:8760},
    ],
  },
  {
    code:'BAT-TH-116', label:'GTB / GTC bâtiment tertiaire',
    calc:(p,z)=>{ const mu={A:0.16,B:0.14,C:0.12}[p.classe||'B']||0.14; const kf=ZONE_FACTOR[z]||1; return Math.round(parseFloat(p.surf||1000)*parseFloat(p.eref||50)*20*mu*kf); },
    params:[
      {id:'surf',label:'Surface (m²)',type:'number',unit:'m²',default:1000,min:50,max:100000},
      {id:'eref',label:'Énergie de référence (kWh/m²/an)',type:'number',unit:'kWh/m²/an',default:50,min:10,max:300},
      {id:'classe',label:'Classe GTB',type:'select',options:['A','B','C'],default:'B'},
    ],
  },
  {
    code:'BAT-TH-113', label:'PAC air/eau ou eau/eau tertiaire',
    calc:(p,z)=>{ const dju={H1:2400,H2:2000,H3:1500}[z]||2000; return Math.round(parseFloat(p.pw||50)*dju*20*(1-1/parseFloat(p.scop||3.5))); },
    params:[
      {id:'pw',label:'Puissance thermique PAC (kW)',type:'number',unit:'kW',default:50,min:5,max:5000},
      {id:'scop',label:'SCOP',type:'number',unit:'',default:3.5,min:2,max:8},
    ],
  },
  {
    code:'BAT-TH-129', label:'PAC air/air multi-split ou VRF tertiaire',
    calc:(p,z)=>{ return Math.round(parseFloat(p.pw||50)*800*15*(1-1/parseFloat(p.seer||4))); },
    params:[
      {id:'pw',label:'Puissance frigorifique nominale (kW)',type:'number',unit:'kW',default:50,min:5,max:2000},
      {id:'seer',label:'SEER',type:'number',unit:'',default:4,min:2,max:10},
    ],
  },
  {
    code:'BAT-TH-142', label:'Déstratificateur d\'air / Brasseur grand volume',
    calc:(p,z)=>{ const kf=ZONE_FACTOR[z]||1; return Math.round(parseFloat(p.surf||500)*parseFloat(p.hsp||6)*0.8*kf); },
    params:[
      {id:'surf',label:'Surface du bâtiment (m²)',type:'number',unit:'m²',default:500,min:50,max:20000},
      {id:'hsp',label:'Hauteur sous plafond (m)',type:'number',unit:'m',default:6,min:4,max:20},
    ],
  },
  {
    code:'IND-UT-102', label:'Récupération chaleur sur effluents industriels',
    calc:(p,z)=>{ return Math.round(parseFloat(p.q||100)*parseFloat(p.dt||30)*0.86*parseFloat(p.h||4000)/1000*20); },
    params:[
      {id:'q',label:'Débit massique (kg/h)',type:'number',unit:'kg/h',default:100,min:1,max:100000},
      {id:'dt',label:'Différence de température (°C)',type:'number',unit:'°C',default:30,min:5,max:200},
      {id:'h',label:'Heures de fonctionnement annuel',type:'number',unit:'h/an',default:4000,min:500,max:8760},
    ],
  },
  {
    code:'IND-UT-115', label:'Isolation réseaux de vapeur / fluides chauds',
    calc:(p,z)=>{ const l=parseFloat(p.long||100); const d=parseFloat(p.diam||0.1); return Math.round(l*Math.PI*d*parseFloat(p.dt||80)*0.04*parseFloat(p.h||8000)/1000*20); },
    params:[
      {id:'long',label:'Longueur réseau à isoler (m)',type:'number',unit:'m',default:100,min:5,max:10000},
      {id:'diam',label:'Diamètre nominal (m)',type:'number',unit:'m',default:0.15,min:0.02,max:2},
      {id:'dt',label:'Température du fluide vs ambiante (°C)',type:'number',unit:'°C',default:80,min:20,max:300},
      {id:'h',label:'Heures annuelles en service (h)',type:'number',unit:'h/an',default:8000,min:500,max:8760},
    ],
  },
  {
    code:'BAT-EQ-134', label:'Meubles frigorifiques à haute performance',
    calc:(p,z)=>{ return Math.round(parseFloat(p.n||10)*parseFloat(p.long||2.5)*parseFloat(p.kw||0.25)*8760*20); },
    params:[
      {id:'n',label:'Nombre de meubles',type:'number',unit:'',default:10,min:1,max:500},
      {id:'long',label:'Longueur unitaire (m)',type:'number',unit:'m',default:2.5,min:0.5,max:6},
      {id:'kw',label:'Économie kW par mètre linéaire',type:'number',unit:'kW/ml',default:0.25,min:0.05,max:1},
    ],
  },

  // ─── BAR — Résidentiel (15 FOSTs principaux) ────────────────────────────
  { code:'BAR-EN-101', label:'Isolation combles ou toiture (résidentiel)',
    calc:(p,z)=>{ const k={H1:1500,H2:1300,H3:900}[z]||1300; return Math.round(parseFloat(p.surf||80)*k); },
    params:[ {id:'surf',label:'Surface isolée (m²)',type:'number',unit:'m²',default:80,min:5,max:1000} ] },
  { code:'BAR-EN-102', label:'Isolation des murs (résidentiel)',
    calc:(p,z)=>{ const k={H1:3300,H2:2900,H3:1800}[z]||2900; return Math.round(parseFloat(p.surf||80)*k); },
    params:[ {id:'surf',label:'Surface murs isolés (m²)',type:'number',unit:'m²',default:80,min:5,max:1000} ] },
  { code:'BAR-EN-103', label:'Isolation plancher bas (résidentiel)',
    calc:(p,z)=>{ const k={H1:1300,H2:1100,H3:800}[z]||1100; return Math.round(parseFloat(p.surf||60)*k); },
    params:[ {id:'surf',label:'Surface plancher bas (m²)',type:'number',unit:'m²',default:60,min:5,max:500} ] },
  { code:'BAR-EN-104', label:'Isolation toiture-terrasse (résidentiel)',
    calc:(p,z)=>{ const k={H1:1700,H2:1500,H3:1100}[z]||1500; return Math.round(parseFloat(p.surf||100)*k); },
    params:[ {id:'surf',label:'Surface toiture (m²)',type:'number',unit:'m²',default:100,min:5,max:500} ] },
  { code:'BAR-EN-107', label:'Fenêtre ou porte-fenêtre complète avec vitrage isolant',
    calc:(p,z)=>{ const k={H1:8500,H2:7300,H3:4800}[z]||7300; return Math.round(parseFloat(p.n||10)*parseFloat(p.surf||1.5)*k/100); },
    params:[
      {id:'n',label:'Nombre de fenêtres',type:'number',unit:'',default:10,min:1,max:50},
      {id:'surf',label:'Surface unitaire (m²)',type:'number',unit:'m²',default:1.5,min:0.5,max:5},
    ] },
  { code:'BAR-TH-104', label:'Chaudière biomasse individuelle (résidentiel)',
    calc:(p,z)=>{ const k={H1:48000,H2:42000,H3:30000}[z]||42000; return Math.round(parseFloat(p.shab||100)/100*k); },
    params:[ {id:'shab',label:'Surface habitable (m²)',type:'number',unit:'m²',default:100,min:30,max:500} ] },
  { code:'BAR-TH-106', label:'Chaudière individuelle haute performance énergétique',
    calc:(p,z)=>{ const k={H1:25500,H2:21500,H3:14500}[z]||21500; return Math.round(parseFloat(p.shab||100)/100*k); },
    params:[ {id:'shab',label:'Surface habitable (m²)',type:'number',unit:'m²',default:100,min:30,max:500} ] },
  { code:'BAR-TH-112', label:'Appareil indépendant de chauffage au bois',
    calc:(p,z)=>{ const k={H1:24500,H2:21000,H3:14500}[z]||21000; return Math.round(parseFloat(p.shab||100)/100*k); },
    params:[ {id:'shab',label:'Surface chauffée (m²)',type:'number',unit:'m²',default:100,min:30,max:300} ] },
  { code:'BAR-TH-129', label:'PAC de type air/eau (résidentiel)',
    calc:(p,z)=>{ const k={H1:48000,H2:42000,H3:30000}[z]||42000; return Math.round(parseFloat(p.shab||100)/100*k*(parseFloat(p.scop||3.5)/3.5)); },
    params:[
      {id:'shab',label:'Surface habitable (m²)',type:'number',unit:'m²',default:100,min:30,max:500},
      {id:'scop',label:'SCOP',type:'number',unit:'',default:3.5,min:2,max:6},
    ] },
  { code:'BAR-TH-137', label:'Raccordement à un réseau de chaleur',
    calc:(p,z)=>{ const k={H1:32000,H2:27000,H3:18000}[z]||27000; return Math.round(parseFloat(p.shab||100)/100*k); },
    params:[ {id:'shab',label:'Surface raccordée (m²)',type:'number',unit:'m²',default:100,min:30,max:5000} ] },
  { code:'BAR-TH-143', label:'Système solaire combiné (SSC)',
    calc:(p,z)=>{ const k={H1:33000,H2:34000,H3:34500}[z]||34000; return Math.round(parseFloat(p.shab||100)/100*k); },
    params:[ {id:'shab',label:'Surface chauffée (m²)',type:'number',unit:'m²',default:100,min:50,max:300} ] },
  { code:'BAR-TH-148', label:'Chauffe-eau thermodynamique à accumulation',
    calc:(p,z)=>{ return Math.round(parseFloat(p.n||1)*9700); },
    params:[ {id:'n',label:'Nombre d\'occupants',type:'number',unit:'pers',default:1,min:1,max:10} ] },
  { code:'BAR-TH-150', label:'PAC hybride individuelle',
    calc:(p,z)=>{ const k={H1:36000,H2:31000,H3:22000}[z]||31000; return Math.round(parseFloat(p.shab||100)/100*k); },
    params:[ {id:'shab',label:'Surface habitable (m²)',type:'number',unit:'m²',default:100,min:30,max:500} ] },
  { code:'BAR-TH-159', label:'VMC double flux auto-réglable',
    calc:(p,z)=>{ const k={H1:7700,H2:6700,H3:4500}[z]||6700; return Math.round(parseFloat(p.shab||100)/100*k); },
    params:[ {id:'shab',label:'Surface habitable (m²)',type:'number',unit:'m²',default:100,min:30,max:500} ] },
  { code:'BAR-TH-164', label:'Rénovation globale d\'une maison individuelle',
    calc:(p,z)=>{ const cef={'40-100':650,'100-150':550,'>150':450}; const k={H1:1.2,H2:1.0,H3:0.7}[z]||1.0; return Math.round(parseFloat(p.shab||100)*(cef[p.classe||'40-100']||650)*k); },
    params:[
      {id:'shab',label:'Surface habitable (m²)',type:'number',unit:'m²',default:100,min:40,max:500},
      {id:'classe',label:'Tranche Cef (kWh/m²/an)',type:'select',options:['40-100','100-150','>150'],default:'40-100'},
    ] },

  // ─── BAR-EQ — Équipements résidentiels ──────────────────────────────────
  { code:'BAR-EQ-115', label:'Lampes à diodes électroluminescentes (LED)',
    calc:(p,z)=>{ return Math.round(parseFloat(p.n||50)*1750); },
    params:[ {id:'n',label:'Nombre de lampes',type:'number',unit:'',default:50,min:1,max:5000} ] },
  { code:'BAR-EQ-117', label:'Lampe LED de classe énergétique A (résidentiel)',
    calc:(p,z)=>{ return Math.round(parseFloat(p.n||50)*2200); },
    params:[ {id:'n',label:'Nombre de lampes',type:'number',unit:'',default:50,min:1,max:5000} ] },

  // ─── BAT — Tertiaire (compléments) ──────────────────────────────────────
  { code:'BAT-EN-101', label:'Isolation combles ou toiture (tertiaire)',
    calc:(p,z)=>{ const k={H1:1900,H2:1700,H3:1100}[z]||1700; return Math.round(parseFloat(p.surf||500)*k); },
    params:[ {id:'surf',label:'Surface isolée (m²)',type:'number',unit:'m²',default:500,min:50,max:50000} ] },
  { code:'BAT-EN-102', label:'Isolation des murs (tertiaire)',
    calc:(p,z)=>{ const k={H1:3700,H2:3300,H3:2200}[z]||3300; return Math.round(parseFloat(p.surf||500)*k); },
    params:[ {id:'surf',label:'Surface murs (m²)',type:'number',unit:'m²',default:500,min:50,max:50000} ] },
  { code:'BAT-EN-103', label:'Isolation plancher bas (tertiaire)',
    calc:(p,z)=>{ const k={H1:1500,H2:1300,H3:900}[z]||1300; return Math.round(parseFloat(p.surf||500)*k); },
    params:[ {id:'surf',label:'Surface plancher bas (m²)',type:'number',unit:'m²',default:500,min:50,max:50000} ] },
  { code:'BAT-EN-108', label:'Fermeture isolante (volets, stores) tertiaire',
    calc:(p,z)=>{ const k={H1:380,H2:310,H3:200}[z]||310; return Math.round(parseFloat(p.n||20)*parseFloat(p.surf||1.5)*k); },
    params:[
      {id:'n',label:'Nombre',type:'number',unit:'',default:20,min:1,max:500},
      {id:'surf',label:'Surface unitaire (m²)',type:'number',unit:'m²',default:1.5,min:0.5,max:10},
    ] },
  { code:'BAT-EQ-127', label:'Système d\'éclairage tertiaire haute efficacité',
    calc:(p,z)=>{ return Math.round(parseFloat(p.surf||500)*parseFloat(p.h||3000)*0.012*20); },
    params:[
      {id:'surf',label:'Surface éclairée (m²)',type:'number',unit:'m²',default:500,min:50,max:50000},
      {id:'h',label:'Heures fonctionnement / an',type:'number',unit:'h/an',default:3000,min:500,max:8760},
    ] },
  { code:'BAT-EQ-133', label:'Programmateur d\'intermittence chauffage tertiaire',
    calc:(p,z)=>{ const k={H1:60,H2:50,H3:35}[z]||50; return Math.round(parseFloat(p.surf||500)*k); },
    params:[ {id:'surf',label:'Surface chauffée (m²)',type:'number',unit:'m²',default:500,min:50,max:10000} ] },

  // ─── IND — Industriel (compléments) ─────────────────────────────────────
  { code:'IND-UT-103', label:'Économiseur sur chaudière (industriel)',
    calc:(p,z)=>{ return Math.round(parseFloat(p.pw||1000)*parseFloat(p.h||4000)*0.05*20); },
    params:[
      {id:'pw',label:'Puissance chaudière (kW)',type:'number',unit:'kW',default:1000,min:50,max:50000},
      {id:'h',label:'Heures fonctionnement / an',type:'number',unit:'h/an',default:4000,min:500,max:8760},
    ] },
  { code:'IND-UT-105', label:'PAC haute température industrielle',
    calc:(p,z)=>{ return Math.round(parseFloat(p.pw||100)*parseFloat(p.h||4000)*(1-1/parseFloat(p.cop||3))*20); },
    params:[
      {id:'pw',label:'Puissance thermique (kW)',type:'number',unit:'kW',default:100,min:10,max:5000},
      {id:'h',label:'Heures fonctionnement',type:'number',unit:'h/an',default:4000,min:500,max:8760},
      {id:'cop',label:'COP',type:'number',unit:'',default:3,min:1.5,max:7},
    ] },
  { code:'IND-UT-117', label:'Variateur électronique de vitesse (moteur industriel)',
    calc:(p,z)=>{ return Math.round(parseFloat(p.pw||50)*parseFloat(p.h||5000)*0.25*20); },
    params:[
      {id:'pw',label:'Puissance moteur (kW)',type:'number',unit:'kW',default:50,min:5,max:1000},
      {id:'h',label:'Heures fonctionnement',type:'number',unit:'h/an',default:5000,min:500,max:8760},
    ] },
  { code:'IND-UT-121', label:'Système de récupération sur compresseur d\'air',
    calc:(p,z)=>{ return Math.round(parseFloat(p.pw||100)*parseFloat(p.h||4000)*0.7*20); },
    params:[
      {id:'pw',label:'Puissance compresseur (kW)',type:'number',unit:'kW',default:100,min:10,max:2000},
      {id:'h',label:'Heures fonctionnement',type:'number',unit:'h/an',default:4000,min:500,max:8760},
    ] },
  { code:'IND-BA-110', label:'Isolation des points singuliers réseau industriel',
    calc:(p,z)=>{ return Math.round(parseFloat(p.n||20)*1500*20); },
    params:[ {id:'n',label:'Nombre points isolés',type:'number',unit:'',default:20,min:1,max:1000} ] },
  { code:'IND-BA-112', label:'Mise sous pression de la production de vapeur',
    calc:(p,z)=>{ return Math.round(parseFloat(p.q||1000)*parseFloat(p.h||4000)*0.04*20); },
    params:[
      {id:'q',label:'Débit vapeur (kg/h)',type:'number',unit:'kg/h',default:1000,min:100,max:100000},
      {id:'h',label:'Heures fonctionnement',type:'number',unit:'h/an',default:4000,min:500,max:8760},
    ] },

  // ─── AGR — Agriculture ──────────────────────────────────────────────────
  { code:'AGR-TH-101', label:'Pré-refroidisseur de lait (élevage laitier)',
    calc:(p,z)=>{ return Math.round(parseFloat(p.l||500)*365*0.25*20); },
    params:[ {id:'l',label:'Production lait quotidienne (L/j)',type:'number',unit:'L/j',default:500,min:50,max:10000} ] },
  { code:'AGR-TH-102', label:'Récupérateur de chaleur sur tank à lait',
    calc:(p,z)=>{ return Math.round(parseFloat(p.l||500)*365*0.18*20); },
    params:[ {id:'l',label:'Production lait quotidienne (L/j)',type:'number',unit:'L/j',default:500,min:50,max:10000} ] },
  { code:'AGR-EQ-101', label:'Échangeur thermique en élevage laitier',
    calc:(p,z)=>{ return Math.round(parseFloat(p.l||500)*365*0.22*20); },
    params:[ {id:'l',label:'Production lait (L/j)',type:'number',unit:'L/j',default:500,min:50,max:10000} ] },
  { code:'AGR-EQ-104', label:'Bloc-traite à variation de vitesse',
    calc:(p,z)=>{ return Math.round(parseFloat(p.n||50)*180*20); },
    params:[ {id:'n',label:'Nombre vaches laitières',type:'number',unit:'',default:50,min:5,max:500} ] },

  // ─── TRA — Transport ────────────────────────────────────────────────────
  { code:'TRA-EQ-101', label:'Lubrifiant économe en énergie pour véhicule',
    calc:(p,z)=>{ return Math.round(parseFloat(p.km||30000)*0.0015*20); },
    params:[ {id:'km',label:'Km annuels par véhicule',type:'number',unit:'km/an',default:30000,min:1000,max:200000} ] },
  { code:'TRA-EQ-115', label:'Pneumatiques à basse résistance au roulement (PL)',
    calc:(p,z)=>{ return Math.round(parseFloat(p.km||100000)*0.005*20); },
    params:[ {id:'km',label:'Km annuels (PL)',type:'number',unit:'km/an',default:100000,min:5000,max:500000} ] },
  { code:'TRA-SE-103', label:'Formation à l\'éco-conduite (PL/VUL)',
    calc:(p,z)=>{ return Math.round(parseFloat(p.n||10)*30000*0.06*20); },
    params:[ {id:'n',label:'Nombre conducteurs formés',type:'number',unit:'',default:10,min:1,max:500} ] },

  // ─── RES — Réseaux ──────────────────────────────────────────────────────
  { code:'RES-CH-104', label:'Calorifugeage d\'un réseau de chaleur',
    calc:(p,z)=>{ return Math.round(parseFloat(p.long||1000)*0.8*20); },
    params:[ {id:'long',label:'Longueur réseau (m)',type:'number',unit:'m',default:1000,min:100,max:50000} ] },
  { code:'RES-EC-104', label:'Pose d\'un échangeur de chaleur sur réseau',
    calc:(p,z)=>{ return Math.round(parseFloat(p.pw||500)*parseFloat(p.h||4000)*0.15*20); },
    params:[
      {id:'pw',label:'Puissance échangée (kW)',type:'number',unit:'kW',default:500,min:50,max:10000},
      {id:'h',label:'Heures',type:'number',unit:'h/an',default:4000,min:500,max:8760},
    ] },
];

const SECTEURS = [
  'Tertiaire (commerce)','Tertiaire (bureaux)','Tertiaire (hôtellerie/restauration)',
  'Tertiaire (santé)','Industrie','Agriculture',
];

/* ─── Escape HTML ─────────────────────────────────────────────────────────── */
function esc(s) { return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;'); }

/* ─── Autocomplete Entreprise inline (réutilise /api/gov/entreprises) ────── */
function InlineEntSearch({ value, onChange, onSelect }) {
  const [results, setResults] = useState([]);
  const [open, setOpen] = useState(false);
  const ref = useRef(null);
  const timer = useRef(null);

  const handleChange = (e) => {
    const v = e.target.value;
    onChange(v);
    clearTimeout(timer.current);
    if (v.length < 2) { setResults([]); return; }
    timer.current = setTimeout(async () => {
      const data = await window.AE_API.fetch(`/api/gov/entreprises?q=${encodeURIComponent(v)}&limit=6`).catch(()=>null);
      setResults(data?.results || []);
      setOpen(true);
    }, 350);
  };

  useEffect(() => {
    const onOut = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
    document.addEventListener('mousedown', onOut);
    return () => document.removeEventListener('mousedown', onOut);
  }, []);

  return (
    <div ref={ref} style={{position:'relative'}}>
      <input className="fi" value={value} onChange={handleChange}
        onFocus={()=>results.length&&setOpen(true)}
        placeholder="Nom d'entreprise ou SIRET…" autoComplete="off" />
      {open && results.length > 0 && (
        <div style={{position:'absolute',top:'calc(100% + 2px)',left:0,right:0,background:'var(--bg2)',border:'1px solid var(--border)',borderRadius:8,boxShadow:'0 8px 24px rgba(0,0,0,.12)',zIndex:200,maxHeight:200,overflowY:'auto'}}>
          {results.map((r,i) => {
            const nom = r.nom_complet || r.nom_raison_sociale || '';
            const siret = r.siege?.siret || r.matching_etablissements?.[0]?.siret || '';
            return (
              <div key={i} onClick={()=>{ onChange(nom.toUpperCase()); onSelect?.(siret); setOpen(false); setResults([]); }}
                style={{padding:'7px 12px',cursor:'pointer',fontSize:11,borderBottom:'1px solid var(--border)'}}
                onMouseEnter={e=>e.currentTarget.style.background='var(--bg3)'}
                onMouseLeave={e=>e.currentTarget.style.background=''}>
                <div style={{fontWeight:600}}>{nom}</div>
                <div style={{fontSize:9,color:'var(--t2)'}}>{siret}</div>
              </div>
            );
          })}
        </div>
      )}
    </div>
  );
}

/* ─── Autocomplete Adresse inline ─────────────────────────────────────────── */
function InlineAdrSearch({ value, onChange }) {
  const [results, setResults] = useState([]);
  const [open, setOpen] = useState(false);
  const ref = useRef(null);
  const timer = useRef(null);

  const handleChange = (e) => {
    const v = e.target.value; onChange(v);
    clearTimeout(timer.current);
    if (v.length < 3) { setResults([]); return; }
    timer.current = setTimeout(async () => {
      const data = await window.AE_API.fetch(`/api/gov/adresses?q=${encodeURIComponent(v)}&limit=5`).catch(()=>null);
      setResults(data?.features || []);
      setOpen(true);
    }, 300);
  };

  useEffect(() => {
    const onOut = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
    document.addEventListener('mousedown', onOut);
    return () => document.removeEventListener('mousedown', onOut);
  }, []);

  return (
    <div ref={ref} style={{position:'relative'}}>
      <input className="fi" value={value} onChange={handleChange}
        onFocus={()=>results.length&&setOpen(true)}
        placeholder="12 rue de la Paix, 75001 Paris…" autoComplete="off" />
      {open && results.length > 0 && (
        <div style={{position:'absolute',top:'calc(100% + 2px)',left:0,right:0,background:'var(--bg2)',border:'1px solid var(--border)',borderRadius:8,boxShadow:'0 8px 24px rgba(0,0,0,.12)',zIndex:200,maxHeight:200,overflowY:'auto'}}>
          {results.map((f,i) => (
            <div key={i} onClick={()=>{ onChange(f.properties?.label||''); setOpen(false); setResults([]); }}
              style={{padding:'7px 12px',cursor:'pointer',fontSize:11,borderBottom:'1px solid var(--border)'}}
              onMouseEnter={e=>e.currentTarget.style.background='var(--bg3)'}
              onMouseLeave={e=>e.currentTarget.style.background=''}>
              {f.properties?.label}
            </div>
          ))}
        </div>
      )}
    </div>
  );
}

/* ─── Ligne opération CEE ─────────────────────────────────────────────────── */
function OperationRow({ op, zone, idx, onChange, onRemove }) {
  const frost = AUDIT_FOSTS.find(f=>f.code===op.fostCode) || AUDIT_FOSTS[0];
  const kwh = useMemo(() => {
    try { return frost.calc(op.params, zone); }
    catch { return 0; }
  }, [op.params, zone, frost]);
  const prime = Math.round(kwh * TAUX / 1000);

  const setParam = (id, v) => onChange({ ...op, params: { ...op.params, [id]: v } });
  const setField = (k, v) => onChange({ ...op, [k]: v });

  return (
    <div style={{background:'var(--bg3)',borderRadius:10,padding:'11px 12px',border:'1px solid var(--border)'}}>
      {/* En-tête ligne */}
      <div style={{display:'flex',alignItems:'center',gap:8,marginBottom:8}}>
        <span style={{background:'var(--plasma)',color:'#fff',borderRadius:5,padding:'2px 8px',fontSize:9.5,fontWeight:700,flexShrink:0}}>
          {idx+1}
        </span>
        <select className="fs" style={{flex:1,fontSize:11,fontWeight:600,padding:'5px 10px'}}
          value={op.fostCode}
          onChange={e=>onChange({...op,fostCode:e.target.value,params:{}})}>
          {AUDIT_FOSTS.map(f=>(
            <option key={f.code} value={f.code}>{f.code} — {f.label}</option>
          ))}
        </select>
        <span style={{fontSize:11,fontWeight:800,color:'var(--signal-deep)',whiteSpace:'nowrap'}}>{kwh.toLocaleString('fr-FR')} kWhc</span>
        <span style={{fontSize:11,fontWeight:800,color:'var(--copper)',whiteSpace:'nowrap'}}>{prime.toLocaleString('fr-FR')} €</span>
        <button className="btn" style={{padding:'3px 8px',fontSize:10,color:'var(--rouge)',background:'var(--rouge-tint)',border:'1px solid var(--rouge)',flexShrink:0}}
          onClick={onRemove}>✕</button>
      </div>

      {/* Paramètres */}
      <div style={{display:'grid',gridTemplateColumns:'repeat(auto-fill,minmax(150px,1fr))',gap:8,marginBottom:8}}>
        {frost.params.map(prm => (
          <div key={prm.id}>
            <label style={{fontSize:10,color:'var(--t2)',display:'block',marginBottom:2}}>{prm.label}</label>
            {prm.type === 'select' ? (
              <select className="fs" style={{fontSize:11,padding:'4px 8px'}}
                value={op.params[prm.id] ?? prm.default}
                onChange={e=>setParam(prm.id, e.target.value)}>
                {prm.options.map(o=><option key={o} value={o}>{o}</option>)}
              </select>
            ) : (
              <input className="fi" type="number" style={{fontSize:11,padding:'4px 8px'}}
                value={op.params[prm.id] ?? prm.default}
                min={prm.min} max={prm.max} step={prm.id==='diam'||prm.id==='eer'||prm.id==='scop'||prm.id==='seer'?0.1:1}
                onChange={e=>setParam(prm.id, e.target.value)} />
            )}
          </div>
        ))}
      </div>

      {/* Équipement */}
      <div style={{display:'grid',gridTemplateColumns:'1fr 1fr 1fr',gap:6}}>
        <div>
          <label style={{fontSize:10,color:'var(--t2)',display:'block',marginBottom:2}}>Marque</label>
          <input className="fi" style={{fontSize:11,padding:'4px 8px'}} value={op.marque||''} placeholder="Ex: Daikin"
            onChange={e=>setField('marque',e.target.value)} />
        </div>
        <div>
          <label style={{fontSize:10,color:'var(--t2)',display:'block',marginBottom:2}}>Modèle</label>
          <input className="fi" style={{fontSize:11,padding:'4px 8px'}} value={op.modele||''} placeholder="Ex: EWYD170"
            onChange={e=>setField('modele',e.target.value)} />
        </div>
        <div>
          <label style={{fontSize:10,color:'var(--t2)',display:'block',marginBottom:2}}>Référence</label>
          <input className="fi" style={{fontSize:11,padding:'4px 8px'}} value={op.ref||''} placeholder="Ex: SN-2026-042"
            onChange={e=>setField('ref',e.target.value)} />
        </div>
      </div>
    </div>
  );
}

/* ─── Génération HTML aperçu ──────────────────────────────────────────────── */
function buildPreviewHtml(site, ops, zone) {
  const { benef='BÉNÉFICIAIRE', siret='', addr='—', secteur='Tertiaire', date='', ref='', sign='Chef de Projet' } = site;
  const dateStr = date ? date.split('-').reverse().join('/') : new Date().toLocaleDateString('fr-FR');
  const refStr = ref || ('AEC-'+new Date().toISOString().slice(0,7));

  let totalKwh = 0, totalPrime = 0;
  const lines = ops.map(op => {
    const frost = AUDIT_FOSTS.find(f=>f.code===op.fostCode) || AUDIT_FOSTS[0];
    let kwh = 0; try { kwh = frost.calc(op.params, zone); } catch {}
    const prime = Math.round(kwh * TAUX / 1000);
    totalKwh += kwh; totalPrime += prime;
    const equip = [op.marque,op.modele,op.ref].filter(Boolean).join(' / ') || 'À renseigner';
    const hyp = frost.params.map(p => {
      const v = op.params[p.id] ?? p.default;
      return `${p.label.replace('★ ','').replace(/\s*\(.+\)\s*/,'').trim()} : ${v}`;
    }).join('<br>');
    return { code:op.fostCode, label:frost.label, equip, hyp, kwh, prime };
  });

  const rowsHtml = lines.length ? `
    <table style="width:100%;border-collapse:collapse;margin-bottom:10px">
      <thead><tr style="background:#0f172a">
        <th style="padding:6px 8px;font-size:7.5px;font-weight:700;text-transform:uppercase;color:#fff;text-align:left">FOST</th>
        <th style="padding:6px 8px;font-size:7.5px;font-weight:700;text-transform:uppercase;color:#fff;text-align:left">Équipement</th>
        <th style="padding:6px 8px;font-size:7.5px;font-weight:700;text-transform:uppercase;color:#fff;text-align:left">Hypothèses</th>
        <th style="padding:6px 8px;font-size:7.5px;font-weight:700;text-transform:uppercase;color:#fff;text-align:right">kWh cumac</th>
        <th style="padding:6px 8px;font-size:7.5px;font-weight:700;text-transform:uppercase;color:#fff;text-align:right">Prime (7,5€)</th>
      </tr></thead><tbody>
      ${lines.map((l,i)=>`
        <tr style="background:${i%2===0?'#fff':'#f8faff'}">
          <td style="padding:7px 8px;font-size:9px;font-weight:700;color:#0f172a;border-bottom:1px solid #f1f5f9;white-space:nowrap">${esc(l.code)}</td>
          <td style="padding:7px 8px;font-size:8.5px;border-bottom:1px solid #f1f5f9"><div style="font-weight:600">${esc(l.equip)}</div><div style="color:#64748b;font-size:7.5px;margin-top:1px">${esc(l.label)}</div></td>
          <td style="padding:7px 8px;font-size:7.5px;color:#64748b;border-bottom:1px solid #f1f5f9;line-height:1.6">${l.hyp}</td>
          <td style="padding:7px 8px;font-size:10px;font-weight:800;color:#059669;text-align:right;border-bottom:1px solid #f1f5f9;white-space:nowrap">${l.kwh.toLocaleString('fr-FR')}</td>
          <td style="padding:7px 8px;font-size:10px;font-weight:800;color:#d97706;text-align:right;border-bottom:1px solid #f1f5f9;white-space:nowrap">${l.prime.toLocaleString('fr-FR')} €</td>
        </tr>`).join('')}
      <tr style="background:#f0f4ff">
        <td colspan="3" style="padding:7px 8px;font-size:10px;font-weight:800;color:#0f172a">TOTAL</td>
        <td style="padding:7px 8px;font-size:13px;font-weight:800;color:#059669;text-align:right">${totalKwh.toLocaleString('fr-FR')}</td>
        <td style="padding:7px 8px;font-size:13px;font-weight:800;color:#d97706;text-align:right">${totalPrime.toLocaleString('fr-FR')} €</td>
      </tr>
      </tbody>
    </table>
    <div style="background:#f0fdf4;border-radius:5px;padding:10px 14px;display:flex;gap:28px;border:1px solid #bbf7d0;margin-bottom:10px">
      <div><div style="font-size:7px;color:#064e3b;font-weight:700;text-transform:uppercase;margin-bottom:2px">Volume CEE total</div><div style="font-size:18px;font-weight:800;color:#059669">${totalKwh.toLocaleString('fr-FR')} kWhc</div></div>
      <div><div style="font-size:7px;color:#064e3b;font-weight:700;text-transform:uppercase;margin-bottom:2px">Prime totale (7,5 €/MWh)</div><div style="font-size:18px;font-weight:800;color:#d97706">${totalPrime.toLocaleString('fr-FR')} €</div></div>
    </div>
  ` : '<div style="padding:18px;text-align:center;color:#94a3b8;font-size:10px;border:1px dashed #e2e8f0;border-radius:8px;margin-bottom:10px">Aucune opération CEE — ajoutez des équipements</div>';

  return `<div style="font-family:Arial,sans-serif;font-size:10px;color:#111;line-height:1.4">
    <div style="text-align:center;font-size:7px;color:#aaa;letter-spacing:2px;margin-bottom:8px;text-transform:uppercase">AUDITS ÉNERGIES — Audit Énergétique Conforme · CEE 6e Période 2026–2030</div>
    <div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:12px;padding-bottom:10px;border-bottom:2.5px solid #0f172a">
      <div>
        <div style="font-size:14px;font-weight:800;color:#0f172a">Audit Énergétique Conforme — Valorisation CEE</div>
        <div style="font-size:8px;color:#64748b;margin-top:2px">${esc(benef.toUpperCase())} · Réf. ${esc(refStr)} · ${dateStr}</div>
      </div>
      <div style="text-align:right"><div style="font-size:11px;font-weight:800;color:#0f172a">Audits Énergies</div><div style="font-size:7px;color:#94a3b8">7,5 €/MWh cumac</div></div>
    </div>
    <div style="display:grid;grid-template-columns:1fr 1fr 1fr;border:1px solid #e2e8f0;border-radius:5px;overflow:hidden;margin-bottom:10px">
      <div style="padding:7px 9px;border-right:1px solid #f1f5f9"><div style="font-size:7px;text-transform:uppercase;color:#94a3b8;font-weight:700;margin-bottom:2px">Bénéficiaire</div><div style="font-size:9.5px;font-weight:700">${esc(benef.toUpperCase())}</div><div style="font-size:8px;color:#64748b">SIRET : ${esc(siret||'—')}</div></div>
      <div style="padding:7px 9px;border-right:1px solid #f1f5f9"><div style="font-size:7px;text-transform:uppercase;color:#94a3b8;font-weight:700;margin-bottom:2px">Adresse chantier</div><div style="font-size:9px;font-weight:600">${esc(addr)}</div><div style="font-size:8px;color:#64748b">Zone ${zone}</div></div>
      <div style="padding:7px 9px"><div style="font-size:7px;text-transform:uppercase;color:#94a3b8;font-weight:700;margin-bottom:2px">Secteur</div><div style="font-size:9px;font-weight:600">${esc(secteur)}</div><div style="font-size:8px;color:#64748b">${dateStr}</div></div>
    </div>
    ${rowsHtml}
    <div style="background:#fffbeb;border:1px solid #fde68a;border-radius:4px;padding:6px 9px;font-size:7.5px;color:#92400e;margin-bottom:10px">⚠ Étude préalable de dimensionnement OBLIGATOIRE signée par professionnel ou BET agréé · Adresse du site et parcelle cadastrale sur toutes les pièces · SIRET installateur obligatoire · Mesures avant/après requises sur certaines FOST</div>
    <div style="display:grid;grid-template-columns:1fr 1fr;gap:16px">
      <div style="border-top:1.5px solid #e5e7eb;padding-top:8px;font-size:7.5px;color:#374151"><strong>Établi par</strong><br>${esc(sign)}<br><br><span style="color:#d1d5db">Signature :</span></div>
      <div style="border-top:1.5px solid #e5e7eb;padding-top:8px;font-size:7.5px;color:#374151"><strong>Lu et approuvé par le bénéficiaire</strong><br><br><br><span style="color:#d1d5db">Date + Signature :</span></div>
    </div>
    <div style="margin-top:10px;font-size:6.5px;color:#9ca3af;text-align:center;border-top:1px solid #f1f5f9;padding-top:6px">Généré par Audits Énergies · Taux 7,5€/MWh cumac · CEE 6e période 2026–2030 · Conforme aux exigences PNCEE</div>
  </div>`;
}

/* ─── Page Audit ──────────────────────────────────────────────────────────── */
let _opCounter = 0;

function AuditPage() {
  const today = new Date().toISOString().slice(0,10);
  const [site, setSite] = useState({
    benef: '', siret: '', addr: '', secteur: SECTEURS[0], zone: 'H1',
    date: today, ref: '', sign: 'Chef de Projet — Audits Énergies',
  });
  const [ops, setOps]     = useState([]);
  const [saving, setSaving] = useState(false);

  const setSiteField = (k, v) => setSite(s=>({...s, [k]:v}));

  const addOp = () => {
    _opCounter++;
    setOps(prev=>[...prev, { id:'op'+_opCounter, fostCode:'BAT-TH-139', marque:'', modele:'', ref:'', params:{} }]);
  };

  const updateOp = (id, updates) => setOps(prev=>prev.map(o=>o.id===id?updates:o));
  const removeOp = (id) => setOps(prev=>prev.filter(o=>o.id!==id));

  const previewHtml = useMemo(()=>buildPreviewHtml(site,ops,site.zone),[site,ops]);

  const totalKwh = useMemo(()=>ops.reduce((sum,op)=>{
    const f=AUDIT_FOSTS.find(x=>x.code===op.fostCode)||AUDIT_FOSTS[0];
    try{return sum+f.calc(op.params,site.zone);}catch{return sum;}
  },0),[ops,site.zone]);

  const totalPrime = Math.round(totalKwh * TAUX / 1000);

  const handlePrint = () => {
    const win = window.open('','_blank');
    win.document.write(`<!doctype html><html><head><meta charset="utf-8"><title>Audit CEE — ${site.benef||'Rapport'}</title><style>body{margin:20px;font-family:Arial,sans-serif}@media print{body{margin:0}}</style></head><body>${previewHtml}</body></html>`);
    win.document.close();
    win.focus();
    setTimeout(()=>win.print(), 400);
  };

  const handleSaveDossier = async () => {
    if (!site.benef) return;
    setSaving(true);
    try {
      await window.AE_API.postJson('/api/cee/drafts', {
        beneficiaireNom: site.benef,
        siret: site.siret,
        address: site.addr,
        zone: site.zone,
        status: 'draft',
        reference: site.ref || ('AEC-'+site.date.slice(0,7)),
        operations: ops.map(op=>{
          const f=AUDIT_FOSTS.find(x=>x.code===op.fostCode)||AUDIT_FOSTS[0];
          let kwh=0; try{kwh=f.calc(op.params,site.zone);}catch{}
          return { fostCode:op.fostCode, kwh, prime:Math.round(kwh*TAUX/1000), marque:op.marque, modele:op.modele };
        }),
      });
      window.AE_API?.hydrate?.();
      alert('✅ Dossier CEE créé !');
    } catch(e) { alert(`❌ Erreur: ${e.message}`); }
    setSaving(false);
  };

  const handleReset = () => {
    if (ops.length > 0 && !confirm('Réinitialiser le formulaire ?')) return;
    setSite({ benef:'', siret:'', addr:'', secteur:SECTEURS[0], zone:'H1', date:today, ref:'', sign:'Chef de Projet — Audits Énergies' });
    setOps([]);
  };

  return (
    <div style={{display:'flex',flexDirection:'column',height:'100%',overflow:'hidden'}}>
      {/* Header */}
      <div style={{padding:'14px 24px',borderBottom:'1px solid var(--border)',flexShrink:0,display:'flex',alignItems:'center',justifyContent:'space-between',flexWrap:'wrap',gap:10}}>
        <div>
          <div style={{fontSize:17,fontWeight:800,letterSpacing:'-0.5px'}}>📋 Audit Énergétique <span style={{color:'var(--signal)'}}>Conforme</span></div>
          <div style={{fontSize:11,color:'var(--t2)',marginTop:2}}>Rapport CEE réglementaire · FOST officielles · 7,5€/MWh cumac · Impression A4</div>
        </div>
        <div style={{display:'flex',gap:8,flexWrap:'wrap',alignItems:'center'}}>
          {totalKwh > 0 && (
            <>
              <span style={{fontSize:12,fontWeight:800,color:'var(--signal-deep)',background:'var(--signal-tint)',padding:'4px 10px',borderRadius:8}}>{totalKwh.toLocaleString('fr-FR')} kWhc</span>
              <span style={{fontSize:12,fontWeight:800,color:'var(--copper)',background:'var(--copper-tint)',padding:'4px 10px',borderRadius:8}}>{totalPrime.toLocaleString('fr-FR')} €</span>
            </>
          )}
          <button className="btn b-ghost" onClick={handleReset}>🔄 Nouveau</button>
          <button className="btn b-amber" onClick={addOp}>+ Opération CEE</button>
          <button className="btn b-ghost" onClick={handleSaveDossier} disabled={saving}>💾 Créer dossier</button>
          <button className="btn b-primary" onClick={handlePrint}>🖨️ Imprimer / PDF</button>
          {window.ModuleSettingsButton && <window.ModuleSettingsButton
            storageKey="ae_audit_settings"
            title="Personnalisation Audit énergétique"
            defaults={{
              tvaDefault: 20,
              zoneClimatique: 'H1',
              uniteCumac: 'kWh',
              fostFavoris: 'BAR-TH-104,BAR-TH-129,BAR-EN-101,BAT-TH-162,IND-UT-115',
              autoSiteAddress: true,
              showProductionMonthly: true,
              auditTemplate: 'audits-energies-classique',
              autoCreateDossierOnSave: true,
              defaultBeneficiaireType: 'particulier',
              showFostHelp: true,
            }}
            sections={[
              { title: 'Valeurs par défaut', fields: [
                { key: 'tvaDefault', label: 'TVA (%)', type: 'number', min: 0, max: 30 },
                { key: 'zoneClimatique', label: 'Zone climatique défaut', type: 'select', options: [
                  { value: 'H1', label: 'H1 (froid)' }, { value: 'H2', label: 'H2 (tempéré)' }, { value: 'H3', label: 'H3 (chaud)' },
                ]},
                { key: 'uniteCumac', label: 'Unité cumac', type: 'select', options: [
                  { value: 'kWh', label: 'kWh' }, { value: 'MWh', label: 'MWh' }, { value: 'GWh', label: 'GWh' },
                ]},
                { key: 'defaultBeneficiaireType', label: 'Type bénéficiaire défaut', type: 'select', options: [
                  { value: 'particulier', label: 'Particulier' }, { value: 'pme', label: 'PME' }, { value: 'tertiaire', label: 'Tertiaire' }, { value: 'industrie', label: 'Industrie' },
                ]},
              ]},
              { title: 'FOST favoris (raccourcis)', fields: [
                { key: 'fostFavoris', label: 'Liste FOST séparés par virgule', type: 'textarea', rows: 2, hint: 'Ex: BAR-TH-104,BAR-EN-101,BAT-TH-162' },
              ]},
              { title: 'Workflow', fields: [
                { key: 'auditTemplate', label: 'Template PDF', type: 'select', options: [
                  { value: 'audits-energies-classique', label: 'Audits Énergies — classique' },
                  { value: 'audits-energies-pro', label: 'Audits Énergies — pro' },
                  { value: 'opqibi-officiel', label: 'OPQIBI officiel' },
                ]},
                { key: 'autoSiteAddress', label: 'Auto-remplir adresse depuis BAN si SIRET valide', type: 'checkbox' },
                { key: 'showProductionMonthly', label: 'Afficher production mensuelle dans le PDF', type: 'checkbox' },
                { key: 'autoCreateDossierOnSave', label: 'Créer dossier CEE auto à la sauvegarde', type: 'checkbox' },
                { key: 'showFostHelp', label: 'Afficher l\'aide FOST inline (tooltips)', type: 'checkbox' },
              ]},
            ]}
          />}
        </div>
      </div>

      <div style={{flex:1,overflow:'hidden',display:'grid',gridTemplateColumns:'1fr 1fr',gap:0}}>
        {/* Colonne gauche — Formulaire */}
        <div style={{overflow:'auto',padding:'14px 16px',borderRight:'1px solid var(--border)',display:'flex',flexDirection:'column',gap:14}}>
          {/* Site info */}
          <div style={{background:'var(--bg2)',borderRadius:12,border:'1px solid var(--border)',overflow:'hidden'}}>
            <div style={{padding:'10px 14px',borderBottom:'1px solid var(--border)',fontSize:12,fontWeight:700}}>📍 Informations du site</div>
            <div style={{padding:'12px 14px',display:'grid',gridTemplateColumns:'1fr 1fr',gap:10}}>
              <div style={{gridColumn:'1/-1'}}>
                <label className="lbl">Raison sociale bénéficiaire <span style={{fontSize:9,background:'var(--plasma-tint)',color:'var(--plasma)',borderRadius:8,padding:'1px 6px',marginLeft:4}}>🏛️ SIRENE</span></label>
                <InlineEntSearch value={site.benef} onChange={v=>setSiteField('benef',v)} onSelect={siret=>setSiteField('siret',siret)} />
              </div>
              <div>
                <label className="lbl">SIRET</label>
                <input className="fi" value={site.siret} onChange={e=>setSiteField('siret',e.target.value)} placeholder="14 chiffres" maxLength={18} />
              </div>
              <div>
                <label className="lbl">Date du rapport</label>
                <input className="fi" type="date" value={site.date} onChange={e=>setSiteField('date',e.target.value)} />
              </div>
              <div style={{gridColumn:'1/-1'}}>
                <label className="lbl">Adresse du chantier <span style={{fontSize:9,background:'var(--signal-tint)',color:'var(--signal-deep)',borderRadius:8,padding:'1px 6px',marginLeft:4}}>📍 BAN</span></label>
                <InlineAdrSearch value={site.addr} onChange={v=>setSiteField('addr',v)} />
              </div>
              <div>
                <label className="lbl">Secteur d'activité</label>
                <select className="fs" value={site.secteur} onChange={e=>setSiteField('secteur',e.target.value)}>
                  {SECTEURS.map(s=><option key={s} value={s}>{s}</option>)}
                </select>
              </div>
              <div>
                <label className="lbl">Zone climatique</label>
                <select className="fs" value={site.zone} onChange={e=>setSiteField('zone',e.target.value)}>
                  <option value="H1">H1 — Île-de-France / Nord</option>
                  <option value="H2">H2 — Ouest / Centre</option>
                  <option value="H3">H3 — Méditerranée / Sud</option>
                </select>
              </div>
              <div>
                <label className="lbl">Référence dossier</label>
                <input className="fi" value={site.ref} onChange={e=>setSiteField('ref',e.target.value)} placeholder="ex: PRJ-2026-042" />
              </div>
              <div>
                <label className="lbl">Signataire</label>
                <input className="fi" value={site.sign} onChange={e=>setSiteField('sign',e.target.value)} />
              </div>
            </div>
          </div>

          {/* ClientPicker (règle 3.a) */}
          {window.ClientPicker && (
            <div style={{background:'var(--bg2)',borderRadius:12,border:'1px solid var(--border)',overflow:'hidden'}}>
              <div style={{padding:'10px 14px',borderBottom:'1px solid var(--border)',fontSize:12,fontWeight:700}}>👤 Lier à un client CRM</div>
              <div style={{padding:'12px 14px'}}>
                <window.ClientPicker onSelect={c=>{
                  if (c.name) setSiteField('benef', c.name.toUpperCase());
                  if (c.siret) setSiteField('siret', c.siret);
                }} />
              </div>
            </div>
          )}

          {/* Opérations CEE */}
          <div style={{background:'var(--bg2)',borderRadius:12,border:'1px solid var(--border)',overflow:'hidden'}}>
            <div style={{padding:'10px 14px',borderBottom:'1px solid var(--border)',display:'flex',alignItems:'center',justifyContent:'space-between'}}>
              <span style={{fontSize:12,fontWeight:700}}>⚙️ Opérations CEE</span>
              <button className="btn b-primary" style={{padding:'4px 12px',fontSize:11}} onClick={addOp}>+ Ajouter opération</button>
            </div>
            <div style={{padding:'12px 14px',display:'flex',flexDirection:'column',gap:8}}>
              {ops.length === 0 ? (
                <div style={{textAlign:'center',padding:24,color:'var(--t2)',fontSize:11,border:'1.5px dashed var(--border)',borderRadius:10}}>
                  Aucune opération — cliquez <strong>+ Ajouter opération</strong> pour commencer
                </div>
              ) : ops.map((op,idx) => (
                <OperationRow key={op.id} op={op} zone={site.zone} idx={idx}
                  onChange={u=>updateOp(op.id,u)} onRemove={()=>removeOp(op.id)} />
              ))}
            </div>
          </div>
        </div>

        {/* Colonne droite — Aperçu */}
        <div style={{overflow:'auto',padding:'14px 16px',display:'flex',flexDirection:'column',gap:12}}>
          <div style={{display:'flex',alignItems:'center',justifyContent:'space-between',flexShrink:0}}>
            <span style={{fontSize:12,fontWeight:700}}>📄 Aperçu rapport</span>
            <div style={{display:'flex',gap:8}}>
              {totalKwh > 0 && (
                <>
                  <span style={{fontSize:11,fontWeight:800,color:'var(--signal-deep)'}}>{totalKwh.toLocaleString('fr-FR')} kWhc</span>
                  <span style={{fontSize:11,fontWeight:800,color:'var(--copper)'}}>{totalPrime.toLocaleString('fr-FR')} €</span>
                </>
              )}
              <button className="btn b-primary" style={{fontSize:11,padding:'4px 10px'}} onClick={handlePrint}>🖨️ PDF</button>
            </div>
          </div>
          <div style={{flex:1,border:'1px solid var(--line)',borderRadius:8,padding:14,background:'var(--paper)',overflowY:'auto',minHeight:400}}
            dangerouslySetInnerHTML={{__html:previewHtml}} />
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { AuditPage });
