/* ──────────────────────────────────────────────────────────────────────────
   VenteEmailModals.jsx — fenêtres d'emails du cycle de vente d'un lot

   Extraites de FichesProgrammes.jsx (dette D1, 2026-06-24). Définies en portée
   globale (convention projet : pas d'import/export). Consommées par App.jsx
   (pilotage statut via Suivi des signatures) et par le bandeau « attestations ».

   - LIAModal            : Lettre d'Intention d'Achat (passage OPTION → « Valider l'option »)
   - NotaireEmailModal   : email notaire (passage LIA)
   - CompromisEmailModal : email de courtoisie au passage COMPROMIS
   - AppelFondsModal      : appel de fonds (échéancier foncier/travaux)

   NB : l'ancienne ArchitecteEmailModal (demande d'attestation depuis la fiche)
   n'a PAS été reprise — elle était morte, remplacée par l'étape 2 de
   ConvertirAppelFondsModal (onglet Appels de fonds).
   ────────────────────────────────────────────────────────────────────────── */

/* ── LIAModal : généré quand le lot passe en statut OPTION ── */
function LIAModal({lot,lotIdx,proj,fiche,lc,crm,onClose,onSent}) {
  const programmeNom = fiche.adresse||proj.ville||proj.nom;
  const clientNom    = lot.clientNom||'';
  const clientCRM    = lot.clientNom ? findCrmContact(crm, lot.clientNom.split(' ')) : null;
  const clientEmail  = clientCRM?.email||'';
  const foncierStr   = lc?.foncierReel > 0 ? fmtEur(lc.foncierReel) : (lc?.foncier ? fmtEur(lc.foncier) : '');
  const travauxStr   = lc?.travauxReel > 0 ? fmtEur(lc.travauxReel) : (lc?.travaux ? fmtEur(lc.travaux) : '');

  /* Fiche client complète dans le CRM (pour les champs LIA) */
  const clientFull = lot.clientNom
    ? (crm?.clients||[]).find(c=>{
        const terms=lot.clientNom.toLowerCase().split(/\s+/).filter(Boolean);
        return terms.some(t=>(c.nom||'').toLowerCase().includes(t)||(c.prenom||'').toLowerCase().includes(t));
      })
    : null;

  const clientNomPrenom = clientFull
    ? `${clientFull.prenom||''} ${clientFull.nom||''}`.trim()
    : clientNom;
  // Sprint Indivision (étape 3) : résolution du type d'acquisition et du co-acheteur.
  const typeAcq    = lot.typeAcquisition||'seul';
  const isCouple   = typeAcq==='couple';
  const isIndivision = typeAcq==='indivision';
  // Co-acheteur CRM (uniquement renseigné en indivision).
  const coAcheteur = isIndivision && lot.coAcheteurClientId
    ? (crm?.clients||[]).find(c=>c&&c.id===lot.coAcheteurClientId)
    : null;
  // Quote-parts : valeurs explicites uniquement en indivision, vides sinon.
  const qpPrincipal  = isIndivision ? Number(lot.quotePartPrincipalPct ?? 50) : null;
  const qpCoAcheteur = isIndivision && qpPrincipal!=null && !isNaN(qpPrincipal) ? (100 - qpPrincipal) : null;
  const fmtQp = (v) => (v!=null && !isNaN(v)) ? `${v}%` : '';

  const defaultBody =
`Madame, Monsieur${clientNom?' '+clientNom:''},\n\nNous avons le plaisir de confirmer votre intention d'acquisition du lot n°${lotIdx+1}${lot.type?' ('+lot.type+')':''}  au sein du programme ${programmeNom}.\n\nVous trouverez ci-joint notre Lettre d'Intention d'Achat. Nous vous prions de bien vouloir la compléter et nous la retourner signée dans les meilleurs délais.\n\nNous restons à votre disposition pour toute question.\n\nCordialement,`;

  const [pdfData,setPdfData]       = useState(null);
  const [pdfFilename,setPdfFn]     = useState('LIA_Lot_'+(lotIdx+1)+'.pdf');
  const [generating,setGenerating] = useState(false);
  const [genErr,setGenErr]         = useState('');
  const [emailTo,setEmailTo]       = useState(clientEmail);
  // Sprint Indivision (étape 3) : pré-remplir le CC avec l'email du co-acheteur en indivision.
  // Pour le couple, le conjointEmail du CRM principal sera dans le payload mais l'email LIA reste
  // historiquement adressé au principal uniquement.
  const [emailCc,setEmailCc]       = useState(isIndivision && coAcheteur?.email ? coAcheteur.email : '');
  const [emailSubject,setEmailSubj]= useState("Lettre d’Intention d’Achat — Lot "+(lotIdx+1)+" — "+programmeNom);
  const [emailBody,setEmailBody]   = useState(defaultBody);
  const [sending,setSending]       = useState(false);
  const [sent,setSent]             = useState(false);
  const [errMsg,setErrMsg]         = useState('');

  const inp={background:"#f8fafc",border:"1px solid #cbd5e1",borderRadius:8,color:"#1e293b",padding:"6px 10px",fontSize:12,width:"100%"};

  const handleGeneratePdf = async () => {
    setGenerating(true); setGenErr('');
    try {
      const resp = await fetch('/api/lia/generate', {
        method:'POST', headers:{'Content-Type':'application/json'},
        body: JSON.stringify({
          // Programme / lot
          adresse:    programmeNom,
          type:       lot.type||'',
          numero:     String(lotIdx+1),
          surface:    lot.surface||'',
          programme:  programmeNom,
          foncier:    foncierStr,
          travaux:    travauxStr,
          // Acquéreur 1
          clientNomPrenom:       clientNomPrenom,
          clientAdresse:         formatAdresse(clientFull),
          clientTelephone:       clientFull?.telephone       || clientCRM?.telephone || '',
          clientEmail:           clientFull?.email           || clientEmail,
          clientDateNaissance:   clientFull?.dateNaissance   || '',
          clientLieuNaissance:   clientFull?.lieuNaissance   || '',
          clientProfession:      clientFull?.profession      || '',
          clientEtatMatrimonial: clientFull?.typeRelation    || '',
          regimeMatrimonial:     clientFull?.regimeMatrimonial || '',
          // Acquéreur 2 : couple → conjoint* du CRM principal ;
          //               indivision → 2e fiche client CRM (coAcheteur) ;
          //               seul → tout vide.
          conjointNomPrenom:     isCouple     ? `${clientFull?.conjointPrenom||''} ${clientFull?.conjointNom||''}`.trim()
                              :  isIndivision ? `${coAcheteur?.prenom||''} ${coAcheteur?.nom||''}`.trim()
                              :                 '',
          conjointAdresse:       isCouple     ? formatAdresse(clientFull)
                              :  isIndivision ? formatAdresse(coAcheteur)
                              :                 '',
          conjointTelephone:     isCouple     ? (clientFull?.conjointTelephone||'')
                              :  isIndivision ? (coAcheteur?.telephone||'')
                              :                 '',
          conjointEmail:         isCouple     ? (clientFull?.conjointEmail||'')
                              :  isIndivision ? (coAcheteur?.email||'')
                              :                 '',
          conjointDateNaissance: isCouple     ? (clientFull?.conjointDateNaissance||'')
                              :  isIndivision ? (coAcheteur?.dateNaissance||'')
                              :                 '',
          conjointLieuNaissance: isCouple     ? (clientFull?.conjointLieuNaissance||'')
                              :  isIndivision ? (coAcheteur?.lieuNaissance||'')
                              :                 '',
          conjointProfession:    isCouple     ? (clientFull?.conjointProfession||'')
                              :  isIndivision ? (coAcheteur?.profession||'')
                              :                 '',
          // État matrimonial : indivision → propre statut du co-acheteur ; couple → côté serveur fallback sur clientEtatMatrimonial.
          conjointEtatMatrimonial: isIndivision ? (coAcheteur?.typeRelation||'') : '',
          // Quote-parts (vides hors indivision)
          clientQuotePart:        fmtQp(qpPrincipal),
          conjointQuotePart:      fmtQp(qpCoAcheteur),
        }),
      });
      const data = await resp.json();
      if (!resp.ok) throw new Error(data.error||'Erreur génération PDF');
      setPdfData(data.pdf);
      setPdfFn(data.filename||('LIA_Lot_'+(lotIdx+1)+'.pdf'));
    } catch(e) { setGenErr(e.message); }
    setGenerating(false);
  };

  const handleDownload = () => {
    const a = document.createElement('a');
    a.href = 'data:application/pdf;base64,'+pdfData;
    a.download = pdfFilename;
    a.click();
  };

  const handleSend = async () => {
    setSending(true); setErrMsg('');
    try {
      await sendEmailApi({
        to: emailTo, cc: emailCc||undefined,
        subject: emailSubject, body: emailBody,
        attachment: pdfData ? { filename:pdfFilename, content:pdfData, contentType:'application/pdf' } : undefined,
      });
      setSent(true);
      if(onSent) onSent(); // enregistre la date d'envoi réelle de la LIA (point de départ des 7j)
    } catch(e) { setErrMsg(e.message); }
    setSending(false);
  };

  return (
    <div style={{position:"fixed",inset:0,background:"rgba(0,0,0,0.5)",zIndex:2000,display:"flex",alignItems:"center",justifyContent:"center",padding:16}} onClick={onClose}>
      <div style={{background:"#fff",borderRadius:16,padding:28,width:720,maxWidth:"96vw",maxHeight:"92vh",overflowY:"auto",boxShadow:"0 8px 40px #0003",border:"1px solid #e2e8f0"}} onClick={e=>e.stopPropagation()}>
        <div style={{fontWeight:800,fontSize:17,marginBottom:4}}>📄 Lettre d&apos;Intention d&apos;Achat — Lot {lotIdx+1}</div>
        <div style={{fontSize:12,color:"#64748b",marginBottom:16}}>{clientNom?<><b>{clientNom}</b> · </>:null}{programmeNom}</div>

        {/* ① Génération PDF */}
        <div style={{background:"#f8fafc",borderRadius:10,padding:16,border:"1px solid #e2e8f0",marginBottom:14}}>
          <div style={{fontWeight:700,fontSize:13,color:"#334155",marginBottom:10}}>① Document PDF (pièce jointe)</div>
          <div style={{display:"grid",gridTemplateColumns:"1fr 1fr 1fr",gap:8,marginBottom:12,fontSize:12,color:"#475569"}}>
            <div><span style={{color:"#94a3b8"}}>Programme : </span>{programmeNom||'—'}</div>
            <div><span style={{color:"#94a3b8"}}>Lot : </span>n°{lotIdx+1}{lot.type?' ('+lot.type+')':''}</div>
            <div><span style={{color:"#94a3b8"}}>Surface : </span>{lot.surface||'—'} m²</div>
            <div><span style={{color:"#94a3b8"}}>Foncier : </span>{foncierStr||'—'}</div>
            <div><span style={{color:"#94a3b8"}}>Travaux : </span>{travauxStr||'—'}</div>
          </div>
          {!pdfData ? (
            <button onClick={handleGeneratePdf} disabled={generating}
              style={{background:generating?"#94a3b8":"#2563eb",color:"#fff",border:"none",borderRadius:8,padding:"8px 20px",fontSize:13,fontWeight:700,cursor:generating?"default":"pointer"}}>
              {generating?"⏳ Génération en cours…":"🔄 Générer le PDF"}
            </button>
          ) : (
            <div style={{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap"}}>
              <span style={{background:"#dcfce7",color:"#15803d",borderRadius:6,padding:"5px 12px",fontSize:12,fontWeight:700}}>✅ {pdfFilename}</span>
              <button onClick={handleDownload} style={{background:"#475569",color:"#fff",border:"none",borderRadius:8,padding:"6px 14px",fontSize:12,cursor:"pointer"}}>⬇ Télécharger</button>
              <button onClick={()=>{setPdfData(null);setGenErr('');}} style={{background:"none",border:"1px solid #e2e8f0",borderRadius:8,padding:"6px 14px",fontSize:12,cursor:"pointer",color:"#64748b"}}>↺ Régénérer</button>
            </div>
          )}
          {genErr&&<div style={{color:"#dc2626",fontSize:12,marginTop:8,background:"#fee2e2",borderRadius:6,padding:"6px 10px"}}>❌ {genErr}</div>}
          {!pdfData&&<div style={{fontSize:11,color:"#f59e0b",marginTop:8}}>💡 Nécessite LibreOffice sur le VPS — <code>sudo apt install -y libreoffice</code></div>}
        </div>

        {/* ② Email */}
        <div style={{background:"#f8fafc",borderRadius:10,padding:16,border:"1px solid #e2e8f0",marginBottom:14}}>
          <div style={{fontWeight:700,fontSize:13,color:"#334155",marginBottom:10}}>② Email au client</div>
          {!clientEmail&&<div style={{background:"#fef9c3",border:"1px solid #fde68a",borderRadius:8,padding:"8px 12px",marginBottom:10,fontSize:12,color:"#92400e"}}>⚠️ Email du client non trouvé dans le CRM. Vérifiez que le nom du lot correspond à une fiche CRM.</div>}
          <div style={{display:"grid",gridTemplateColumns:"1fr 1fr",gap:8,marginBottom:8}}>
            <div>
              <div style={{fontSize:11,color:"#64748b",marginBottom:3}}>Destinataire (À)</div>
              <input value={emailTo} onChange={e=>setEmailTo(e.target.value)} style={inp} placeholder="email@client.fr"/>
            </div>
            <div>
              <div style={{fontSize:11,color:"#64748b",marginBottom:3}}>Copie (Cc)</div>
              <input value={emailCc} onChange={e=>setEmailCc(e.target.value)} style={inp} placeholder="Optionnel"/>
            </div>
          </div>
          <div style={{marginBottom:8}}>
            <div style={{fontSize:11,color:"#64748b",marginBottom:3}}>Objet</div>
            <input value={emailSubject} onChange={e=>setEmailSubj(e.target.value)} style={inp}/>
          </div>
          <div>
            <div style={{fontSize:11,color:"#64748b",marginBottom:3}}>Corps du message{pdfData?' (le PDF est en pièce jointe)':''}</div>
            <textarea value={emailBody} onChange={e=>setEmailBody(e.target.value)} style={{...inp,height:160,resize:"vertical",lineHeight:1.5}}/>
          </div>
          {pdfData&&<div style={{fontSize:11,color:"#15803d",marginTop:6}}>📎 Pièce jointe : {pdfFilename}</div>}
        </div>

        {errMsg&&<div style={{background:"#fee2e2",border:"1px solid #fca5a5",borderRadius:8,padding:"8px 12px",marginBottom:10,fontSize:12,color:"#dc2626"}}>❌ {errMsg}</div>}
        {sent&&<div style={{background:"#dcfce7",border:"1px solid #86efac",borderRadius:8,padding:"8px 12px",marginBottom:10,fontSize:12,color:"#15803d"}}>✅ Email envoyé avec succès {pdfData?"(avec PDF en pièce jointe)":""}!</div>}

        <div style={{display:"flex",gap:8,justifyContent:"flex-end",flexWrap:"wrap"}}>
          <button onClick={onClose} style={{background:"#f1f5f9",border:"1px solid #e2e8f0",borderRadius:8,padding:"8px 18px",fontSize:13,cursor:"pointer"}}>Fermer</button>
          {!sent&&(
            <button onClick={handleSend} disabled={sending||!emailTo}
              style={{background:sending||!emailTo?"#94a3b8":"#2563eb",color:"#fff",border:"none",borderRadius:8,padding:"8px 22px",fontSize:13,fontWeight:700,cursor:sending||!emailTo?"default":"pointer"}}>
              {sending?"⏳ Envoi…":pdfData?"📧 Envoyer avec PDF":"📧 Envoyer sans PDF"}
            </button>
          )}
        </div>
      </div>
    </div>
  );
}

/* ── NotaireEmailModal : généré quand le lot passe en statut LIA ──
   Notaire = intervenant rôle « Notaire » rattaché au programme (emails de son
   entreprise CRM). Corps éditable. LIA signée en PJ facultative. Co-acquéreur
   (couple/indivision) inclus. Prix réel si saisi, sinon prévisionnel. */
function NotaireEmailModal({lot,lotIdx,proj,fiche,lc,crm,onClose,onSent}) {
  const programmeNom=fiche.adresse||proj.ville||proj.nom;

  // Notaire(s) rattaché(s) au programme : intervenant rôle « Notaire » → entreprise CRM.
  // Emails : niveau entreprise d'abord ; à défaut, emails des CONTACTS de l'entreprise
  // (libellé = nom + fonction). Plusieurs options → l'utilisateur choisit (cases à cocher).
  const notaireIntervenants=(fiche.intervenants||[]).filter(iv=>iv&&iv.role==="Notaire");
  const emailOptions=[];
  const _seenEmails=new Set();
  const _addOpt=(email,label)=>{
    const e=(email||'').trim();
    if(e&&!_seenEmails.has(e.toLowerCase())){ _seenEmails.add(e.toLowerCase()); emailOptions.push({email:e,label:label||e}); }
  };
  notaireIntervenants.forEach(iv=>{
    const ent=((crm&&crm.entreprises)||[]).find(e=>e&&e.id===iv.entrepriseId);
    if(!ent) return;
    const entNom=ent.nom||iv.entrepriseNom||'Entreprise';
    const entEmails=(ent.emails||'').split(/[,;\s]+/).map(s=>s.trim()).filter(Boolean);
    if(entEmails.length){
      entEmails.forEach(a=>_addOpt(a,entNom));
    } else {
      (ent.contacts||[]).forEach(ct=>{
        if(ct&&ct.email){
          const nm=`${ct.prenom||''} ${ct.nom||''}`.trim();
          _addOpt(ct.email,(nm||'Contact')+(ct.fonction?` — ${ct.fonction}`:'')+(entNom?` · ${entNom}`:''));
        }
      });
    }
  });

  // Acquéreur(s) : principal + co-acquéreur (couple → conjoint ; indivision → 2e fiche CRM).
  const typeAcq=lot.typeAcquisition||'seul';
  const isCouple=typeAcq==='couple';
  const isIndivision=typeAcq==='indivision';
  const clientFull=lot.clientId
    ? ((crm&&crm.clients)||[]).find(c=>c&&c.id===lot.clientId)
    : (lot.clientNom?findCrmContact(crm,lot.clientNom.split(' ')):null);
  const principalNom=lot.clientNom||(clientFull?`${clientFull.prenom||''} ${clientFull.nom||''}`.trim():'[Nom du client]');
  let coNom='';
  if(isCouple&&clientFull) coNom=`${clientFull.conjointPrenom||''} ${clientFull.conjointNom||''}`.trim();
  else if(isIndivision&&lot.coAcheteurClientId){
    const co=((crm&&crm.clients)||[]).find(c=>c&&c.id===lot.coAcheteurClientId);
    if(co) coNom=`${co.prenom||''} ${co.nom||''}`.trim();
  }
  const acquereurStr=coNom?`${principalNom} et ${coNom}`:principalNom;

  // Prix : réel si saisi, sinon prévisionnel.
  const prixReel=toN(lot.prixReel);
  const prixVente=prixReel>0?fmtEur(prixReel):(lc?.prixFinal?fmtEur(lc.prixFinal):'[prix à confirmer]');

  const defaultBody=
`Madame, Monsieur,

Nous avons le plaisir de vous informer qu'une Lettre d'Intention d'Achat a été acceptée pour le lot n°${lotIdx+1} du programme ${programmeNom}.

Nous vous serions reconnaissants de bien vouloir prendre en charge la rédaction du compromis de vente et de nous recontacter pour la suite de la procédure.

INFORMATIONS DU LOT :
─────────────────────────────────────────
  Programme  : ${programmeNom}
  Lot N°     : ${lotIdx+1}${lot.type?` (${lot.type})`:''}
  Surface    : ${lot.surface||'—'} m²
  Prix TTC   : ${prixVente}
  Acquéreur${coNom?'s':''}  : ${acquereurStr}
─────────────────────────────────────────

Nous restons à votre disposition pour vous fournir tout document complémentaire.

Cordialement,`;

  const [sending,setSending]=useState(false);
  const [sent,setSent]=useState(false);
  const [errMsg,setErrMsg]=useState('');
  const [copied,setCopied]=useState(false);
  const [emailBody,setEmailBody]=useState(defaultBody);
  const [pdfData,setPdfData]=useState(null);       // base64 LIA signée (facultatif)
  const [pdfFilename,setPdfFilename]=useState('');
  // Destinataires cochés (toutes les options trouvées pré-cochées par défaut).
  const [selectedEmails,setSelectedEmails]=useState(()=>emailOptions.map(o=>o.email));
  const toEmails=selectedEmails.join(', ');
  const toggleEmail=(email)=>setSelectedEmails(prev=>prev.includes(email)?prev.filter(x=>x!==email):[...prev,email]);

  const sinp={background:"#f8fafc",border:"1px solid #cbd5e1",borderRadius:8,color:"#1e293b",padding:"6px 10px",fontSize:11,width:"100%"};

  const handleFile=(e)=>{
    const f=e.target.files&&e.target.files[0];
    if(!f) return;
    const reader=new FileReader();
    reader.onload=()=>{ const b64=String(reader.result||'').split(',')[1]||''; setPdfData(b64); setPdfFilename(f.name); };
    reader.readAsDataURL(f);
  };
  const handleCopy=()=>{navigator.clipboard.writeText(emailBody).then(()=>{setCopied(true);setTimeout(()=>setCopied(false),2500);});};
  const handleSend=async()=>{
    setSending(true);setErrMsg('');
    try{
      await sendEmailApi({
        to:toEmails,
        subject:`Dossier compromis — ${programmeNom} — Lot ${lotIdx+1}`,
        body:emailBody,
        attachment: pdfData ? {filename:pdfFilename||`LIA_signee_Lot_${lotIdx+1}.pdf`, content:pdfData, contentType:'application/pdf'} : undefined,
      });
      setSent(true);
      if(onSent) onSent(); // enregistre la date « LIA transmise au notaire »
    }
    catch(e){setErrMsg(e.message);}
    setSending(false);
  };
  return (
    <div style={{position:"fixed",inset:0,background:"rgba(0,0,0,0.5)",zIndex:2000,display:"flex",alignItems:"center",justifyContent:"center",padding:16}} onClick={onClose}>
      <div style={{background:"#fff",borderRadius:16,padding:28,width:640,maxWidth:"96vw",maxHeight:"90vh",overflowY:"auto",boxShadow:"0 8px 40px #0003",border:"1px solid #e2e8f0"}} onClick={e=>e.stopPropagation()}>
        <div style={{fontWeight:800,fontSize:17,marginBottom:4}}>⚖️ Email Notaire — Lot {lotIdx+1} passé sous LIA</div>
        <div style={{fontSize:12,color:"#64748b",marginBottom:14}}><b>{acquereurStr}</b> · {programmeNom}</div>
        {emailOptions.length>0?(
          <div style={{background:"#f0fdf4",border:"1px solid #86efac",borderRadius:8,padding:"8px 12px",marginBottom:12,fontSize:12}}>
            <div style={{color:"#15803d",fontWeight:700,marginBottom:6}}>Destinataire{emailOptions.length>1?'s'+' (cochez ceux à contacter)':''} :</div>
            <div style={{display:"flex",flexDirection:"column",gap:4}}>
              {emailOptions.map(o=>(
                <label key={o.email} style={{display:"flex",alignItems:"center",gap:8,cursor:"pointer"}}>
                  <input type="checkbox" checked={selectedEmails.includes(o.email)} onChange={()=>toggleEmail(o.email)}/>
                  <span style={{fontFamily:"monospace"}}>{o.email}</span>
                  {o.label&&o.label!==o.email&&<span style={{color:"#64748b"}}>({o.label})</span>}
                </label>
              ))}
            </div>
          </div>
        ):(
          <div style={{background:"#fef9c3",border:"1px solid #fde68a",borderRadius:8,padding:"8px 12px",marginBottom:12,fontSize:12,color:"#92400e"}}>
            ⚠️ Aucun email de notaire trouvé pour ce programme. Vérifiez qu'un intervenant rôle « Notaire » est rattaché à la fiche, et que son entreprise CRM a un email (au niveau entreprise ou sur un de ses contacts).
          </div>
        )}
        <div style={{marginBottom:12}}>
          <div style={{fontSize:11,color:"#64748b",marginBottom:4}}>Email au notaire (modifiable)</div>
          <textarea value={emailBody} onChange={e=>setEmailBody(e.target.value)} style={{...sinp,height:260,fontFamily:"'Courier New',monospace",resize:"vertical",lineHeight:1.5}}/>
        </div>
        <div style={{marginBottom:14,background:"#f8fafc",border:"1px solid #e2e8f0",borderRadius:8,padding:"10px 12px"}}>
          <div style={{fontSize:11,fontWeight:700,color:"#334155",marginBottom:6}}>Pièce jointe — LIA signée (facultatif)</div>
          {!pdfData?(
            <label style={{display:"inline-block",background:"#475569",color:"#fff",borderRadius:8,padding:"6px 14px",fontSize:12,cursor:"pointer",fontWeight:600}}>
              📎 Joindre la LIA signée
              <input type="file" accept="application/pdf,image/*" onChange={handleFile} style={{display:"none"}}/>
            </label>
          ):(
            <div style={{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap"}}>
              <span style={{background:"#dcfce7",color:"#15803d",borderRadius:6,padding:"5px 12px",fontSize:12,fontWeight:700}}>📎 {pdfFilename}</span>
              <button onClick={()=>{setPdfData(null);setPdfFilename('');}} style={{background:"none",border:"1px solid #e2e8f0",borderRadius:8,padding:"5px 12px",fontSize:12,cursor:"pointer",color:"#64748b"}}>Retirer</button>
            </div>
          )}
        </div>
        {errMsg&&<div style={{background:"#fee2e2",border:"1px solid #fca5a5",borderRadius:8,padding:"8px 12px",marginBottom:10,fontSize:12,color:"#dc2626"}}>❌ {errMsg}</div>}
        {sent&&<div style={{background:"#dcfce7",border:"1px solid #86efac",borderRadius:8,padding:"8px 12px",marginBottom:10,fontSize:12,color:"#15803d"}}>✅ Email envoyé au notaire {pdfData?"(avec PJ)":""}!</div>}
        <div style={{display:"flex",gap:8,justifyContent:"flex-end",flexWrap:"wrap"}}>
          <button onClick={onClose} style={{background:"#f1f5f9",border:"1px solid #e2e8f0",borderRadius:8,padding:"8px 18px",fontSize:13,cursor:"pointer"}}>Fermer</button>
          <button onClick={handleCopy} style={{background:copied?"#16a34a":"#475569",color:"#fff",border:"none",borderRadius:8,padding:"8px 18px",fontSize:13,fontWeight:600,cursor:"pointer"}}>{copied?"✓ Copié !":"📋 Copier"}</button>
          {emailOptions.length>0&&!sent&&<button onClick={handleSend} disabled={sending||selectedEmails.length===0} style={{background:(sending||selectedEmails.length===0)?"#94a3b8":"#2563eb",color:"#fff",border:"none",borderRadius:8,padding:"8px 22px",fontSize:13,fontWeight:700,cursor:(sending||selectedEmails.length===0)?"default":"pointer"}}>{sending?"⏳ Envoi...":"📧 Envoyer au notaire"}</button>}
        </div>
      </div>
    </div>
  );
}

/* ── CompromisEmailModal : email de courtoisie au passage COMPROMIS ── */
function CompromisEmailModal({lot,lotIdx,proj,fiche,crm,onClose}) {
  const [sending,setSending]=useState(false);
  const [sent,setSent]=useState(false);
  const [errMsg,setErrMsg]=useState('');
  const [fileData,setFileData]=useState(null); // {filename, contentType, content (base64)}
  const [fileErr,setFileErr]=useState('');

  const programmeNom=fiche.adresse||proj.ville||proj.nom;
  const clientNom=lot&&lot.clientNom||'[Nom du client]';

  // Résolution destinataires depuis CRM
  const client=crm&&lot&&(crm.clients||[]).find(c=>c.id===lot.clientId);
  const cgp=crm&&lot&&(crm.cgps||[]).find(c=>c.id===lot.cgpId);
  const clientEmail=client&&client.email||'';
  const typeAcq=(lot&&lot.typeAcquisition)||'seul';
  // Couple (1 foyer) : conjoint du client principal. Indivision (2 foyers) : co-acheteur (2e fiche CRM).
  const conjointEmail=typeAcq==='couple'&&client&&client.conjointEmail||'';
  const coAcheteur=typeAcq==='indivision'&&lot&&lot.coAcheteurClientId
    ? ((crm&&crm.clients)||[]).find(c=>c&&c.id===lot.coAcheteurClientId)
    : null;
  const coAcheteurEmail=coAcheteur&&coAcheteur.email||'';
  const cgpEmails=cgp&&cgp.emails?cgp.emails.split(/[,;\s]+/).map(e=>e.trim()).filter(Boolean):[];

  // To = client + conjoint (couple) ou + co-acquéreur (indivision)
  const toEmails=[clientEmail,conjointEmail,coAcheteurEmail].filter(Boolean).join(', ');
  // CC = CGP
  const ccEmails=cgpEmails.join(', ');

  const [to,  setTo ]=useState(toEmails);
  const [cc,  setCc ]=useState(ccEmails);
  const [subj,setSubj]=useState(`Votre compromis de vente — ${programmeNom} — Lot ${lotIdx+1}`);
  const [body,setBody]=useState(
`${clientNom},

Nous avons le plaisir de vous confirmer la signature de votre compromis de vente pour le lot n°${lotIdx+1} du programme ${programmeNom}.

Vous trouverez ci-joint l'exemplaire signé pour vos archives.

La prochaine étape est la signature de l'acte authentique chez le notaire, dont nous vous communiquerons les modalités en temps voulu.

Nous restons à votre disposition pour toute question.

Cordialement,`
  );

  const sinp={background:"#f8fafc",border:"1px solid #cbd5e1",borderRadius:8,color:"#1e293b",padding:"6px 10px",fontSize:12,width:"100%"};

  const handleFile=async(e)=>{
    const file=e.target.files&&e.target.files[0];
    if(!file){setFileData(null);return;}
    if(file.size>10*1024*1024){setFileErr('Fichier trop volumineux (max 10 Mo)');setFileData(null);return;}
    setFileErr('');
    const b64=await new Promise((resolve,reject)=>{
      const reader=new FileReader();
      reader.onloadend=()=>resolve(reader.result.split(',')[1]);
      reader.onerror=reject;
      reader.readAsDataURL(file);
    });
    setFileData({filename:file.name,contentType:file.type||'application/pdf',content:b64});
  };

  const handleSend=async()=>{
    if(!to.trim()){alert('Le destinataire (À) est requis.');return;}
    setSending(true);setErrMsg('');
    try{
      const payload={to:to.trim(),subject:subj.trim(),body:body.trim()};
      if(cc.trim()) payload.cc=cc.trim();
      if(fileData) payload.attachment=fileData;
      await sendEmailApi(payload);
      setSent(true);
    }catch(e){setErrMsg(e.message);}
    setSending(false);
  };

  return(
    <div style={{position:"fixed",inset:0,background:"rgba(0,0,0,0.5)",zIndex:2000,display:"flex",alignItems:"center",justifyContent:"center",padding:16}}
      onClick={e=>{if(e.target===e.currentTarget&&!sending)onClose();}}>
      <div style={{background:"#fff",borderRadius:16,padding:28,width:660,maxWidth:"96vw",maxHeight:"92vh",overflowY:"auto",boxShadow:"0 8px 40px #0003",border:"1px solid #e2e8f0"}}
        onClick={e=>e.stopPropagation()}>
        <div style={{fontWeight:800,fontSize:17,marginBottom:4}}>📄 Email de courtoisie — Compromis signé</div>
        <div style={{fontSize:12,color:"#64748b",marginBottom:14}}><b>{clientNom}</b> · {programmeNom} · Lot {lotIdx+1}</div>

        {!clientEmail&&(
          <div style={{background:"#fef9c3",border:"1px solid #fde68a",borderRadius:8,padding:"8px 12px",marginBottom:12,fontSize:12,color:"#92400e"}}>
            ⚠️ Email client non trouvé dans le CRM — vérifiez la fiche client.
          </div>
        )}

        <div style={{display:"grid",gap:10,marginBottom:14}}>
          <div>
            <label style={{fontSize:11,fontWeight:700,color:"#64748b",display:"block",marginBottom:3}}>À *</label>
            <input value={to} onChange={e=>setTo(e.target.value)} style={sinp} placeholder="email@client.fr"/>
          </div>
          <div>
            <label style={{fontSize:11,fontWeight:700,color:"#64748b",display:"block",marginBottom:3}}>CC (CGP)</label>
            <input value={cc} onChange={e=>setCc(e.target.value)} style={sinp} placeholder="cgp@exemple.fr"/>
          </div>
          <div>
            <label style={{fontSize:11,fontWeight:700,color:"#64748b",display:"block",marginBottom:3}}>Sujet</label>
            <input value={subj} onChange={e=>setSubj(e.target.value)} style={sinp}/>
          </div>
          <div>
            <label style={{fontSize:11,fontWeight:700,color:"#64748b",display:"block",marginBottom:3}}>Corps du message</label>
            <textarea value={body} onChange={e=>setBody(e.target.value)} rows={9}
              style={{...sinp,resize:"vertical",fontFamily:"inherit",lineHeight:1.55}}/>
          </div>
          <div>
            <label style={{fontSize:11,fontWeight:700,color:"#64748b",display:"block",marginBottom:3}}>Compromis signé (PJ)</label>
            <input type="file" accept=".pdf,.doc,.docx" onChange={handleFile}
              style={{fontSize:12,color:"#1e293b"}}/>
            {fileErr&&<div style={{color:"#dc2626",fontSize:11,marginTop:3}}>{fileErr}</div>}
            {fileData&&<div style={{color:"#16a34a",fontSize:11,marginTop:3}}>📎 {fileData.filename}</div>}
            {!fileData&&<div style={{color:"#94a3b8",fontSize:11,marginTop:3}}>Aucun fichier sélectionné — l'email sera envoyé sans pièce jointe</div>}
          </div>
        </div>

        {errMsg&&<div style={{background:"#fee2e2",border:"1px solid #fca5a5",borderRadius:8,padding:"8px 12px",marginBottom:10,fontSize:12,color:"#dc2626"}}>❌ {errMsg}</div>}
        {sent&&<div style={{background:"#dcfce7",border:"1px solid #86efac",borderRadius:8,padding:"8px 12px",marginBottom:10,fontSize:12,color:"#15803d"}}>✅ Email envoyé au client !</div>}

        <div style={{display:"flex",gap:8,justifyContent:"flex-end",flexWrap:"wrap"}}>
          <button onClick={onClose} style={{background:"#f1f5f9",border:"1px solid #e2e8f0",borderRadius:8,padding:"8px 18px",fontSize:13,cursor:"pointer"}}>
            {sent?"Fermer":"Passer sans envoyer"}
          </button>
          {!sent&&(
            <button onClick={handleSend} disabled={sending||!to.trim()}
              style={{background:sending||!to.trim()?"#94a3b8":"#7c3aed",color:"#fff",border:"none",borderRadius:8,
                padding:"8px 22px",fontSize:13,fontWeight:700,cursor:sending?"default":"pointer"}}>
              {sending?"⏳ Envoi…":"📧 Envoyer"}
            </button>
          )}
        </div>
      </div>
    </div>
  );
}

/* ── AppelFondsModal ── */
const APPEL_STAGE_LABELS=["Foncier (vente)","Fondations (10%)","Élévation des murs (30%)","Hors d'eau (30%)","Hors d'air (25%)","Livraison (5%)"];
function AppelFondsModal({lot,lotIdx,proj,fiche,lc,rows,values,crm,callIdxOverride,onClose}) {
  const [copied,setCopied]=useState(false);
  const [selIban,setSelIban]=useState("");

  // Flux du lot dans le Plan Hebdo, triés par date
  const lotRow=rows.find(r=>r.projetId===proj.id&&r.label===`Lot ${lotIdx+1}`);
  const lotVals=useMemo(()=>lotRow
    ?[...values.filter(v=>v.rowId===lotRow.id)].sort((a,b)=>a.weekIso.localeCompare(b.weekIso))
    :[]
  ,[rows,values,lotRow]);

  // callIdx : soit imposé par le statut (callIdxOverride), soit calculé depuis les dates
  const nextIdx=lotVals.findIndex(v=>v.weekIso>=todayIso);
  const callIdx=callIdxOverride!==undefined?callIdxOverride:(nextIdx>=0?nextIdx:Math.max(0,lotVals.length-1));
  const targetVal=lotVals[callIdx]||null;
  const callNum=callIdx+1;
  const totalCalls=lotVals.length||APPEL_STAGE_LABELS.length;
  const stageLabel=APPEL_STAGE_LABELS[callIdx]||`Appel n°${callNum}`;

  const dateStr=targetVal
    ?new Date(targetVal.weekIso+"T12:00:00Z").toLocaleDateString("fr-FR",{day:"numeric",month:"long",year:"numeric"})
    :"—";
  const montantStr=targetVal?fmtEur(Math.abs(targetVal.montant)):"—";
  const clientNom=lot.clientNom||"[Nom du client]";
  const programmeNom=fiche.adresse||(proj.ville||proj.nom);

  // IBAN : priorité à l'IBAN saisi dans la fiche programme, sinon sélecteur CRM
  const progIban=fiche.ibanProgramme||"";
  const ibanLine=progIban||selIban||"[IBAN À COMPLÉTER]";
  const refLine=`LOT${lotIdx+1}-${(proj.ville||proj.nom).replace(/\s+/g,"-").toUpperCase().slice(0,20)}-APPEL${callNum}`;

  // Collecte des IBANs CRM (affiché uniquement si pas d'IBAN programme)
  const allIbans=useMemo(()=>{
    if(progIban) return [];
    const list=[];
    ((crm||{}).entreprises||[]).forEach(e=>{
      if(e.iban) list.push({label:`${e.nom||"?"} — ${e.iban}`,iban:e.iban});
      (e.comptesBancaires||[]).forEach(cb=>{if(cb.iban) list.push({label:`${e.nom||"?"} — ${cb.libelle||cb.banque||"?"} — ${cb.iban}`,iban:cb.iban});});
    });
    return list;
  },[crm,progIban]);

  const emailBody=
`Objet : Appel de fonds n°${callNum}/${totalCalls} — Lot ${lotIdx+1} — ${proj.ville||proj.nom}

Madame, Monsieur ${clientNom},

Nous vous contactons dans le cadre de votre acquisition du lot n°${lotIdx+1}${lot.type?` (${lot.type})`:""}${programmeNom?" au sein du programme " + programmeNom:""}.

Conformément à l'échéancier contractuel, nous vous prions de bien vouloir procéder au règlement de l'appel de fonds suivant :

────────────────────────────────────────
  APPEL DE FONDS N°${callNum} / ${totalCalls}
  Stade        : ${stageLabel}
  Montant TTC  : ${montantStr}
  Échéance     : ${dateStr}
────────────────────────────────────────

COORDONNÉES BANCAIRES
  Bénéficiaire : ${proj.ville||proj.nom}
  IBAN         : ${ibanLine}
  Référence    : ${refLine}

Nous vous remercions de bien vouloir indiquer la référence ci-dessus dans le libellé du virement afin de faciliter le traitement de votre règlement.

Nous restons à votre disposition pour toute question.

Cordialement,`;

  const handleCopy=()=>{
    navigator.clipboard.writeText(emailBody).then(()=>{setCopied(true);setTimeout(()=>setCopied(false),2500);});
  };
  const sinp={background:"#f8fafc",border:"1px solid #cbd5e1",borderRadius:8,color:"#1e293b",padding:"6px 10px",fontSize:12,width:"100%"};

  return (
    <div style={{position:"fixed",inset:0,background:"rgba(0,0,0,0.5)",zIndex:2000,display:"flex",alignItems:"center",justifyContent:"center",padding:16}} onClick={onClose}>
      <div style={{background:"#fff",borderRadius:16,padding:28,width:640,maxWidth:"96vw",maxHeight:"90vh",overflowY:"auto",boxShadow:"0 8px 40px #0003",border:"1px solid #e2e8f0"}} onClick={e=>e.stopPropagation()}>
        <div style={{fontWeight:800,fontSize:17,marginBottom:4}}>📧 Appel de fonds — Lot {lotIdx+1}</div>
        <div style={{fontSize:12,color:"#64748b",marginBottom:4}}>
          <b>{clientNom}</b> · {proj.ville||proj.nom}
          {fiche.adresse&&<span style={{marginLeft:6,color:"#94a3b8"}}>{fiche.adresse}</span>}
        </div>
        {/* Badge stade en cours */}
        <div style={{marginBottom:14}}>
          <span style={{background:"#dbeafe",color:"#1d4ed8",borderRadius:6,padding:"3px 10px",fontSize:12,fontWeight:700}}>
            {stageLabel}
          </span>
          {callIdxOverride!==undefined&&<span style={{fontSize:11,color:"#64748b",marginLeft:8}}>déclenché par changement de statut</span>}
        </div>

        {/* Échéancier */}
        {lotVals.length>0?(
          <div style={{background:"#f8fafc",borderRadius:8,border:"1px solid #e2e8f0",padding:12,marginBottom:14}}>
            <div style={{fontSize:11,fontWeight:700,color:"#334155",marginBottom:8}}>Échéancier du lot ({totalCalls} appels)</div>
            <div style={{display:"flex",gap:5,flexWrap:"wrap"}}>
              {lotVals.map((v,i)=>{
                const isPast=v.weekIso<todayIso;
                const isNext=i===callIdx;
                return (
                  <div key={v.weekIso} style={{background:isNext?"#dbeafe":isPast?"#dcfce7":"#f1f5f9",color:isNext?"#1d4ed8":isPast?"#15803d":"#64748b",borderRadius:6,padding:"4px 8px",fontSize:10,fontWeight:isNext?700:400,border:isNext?"2px solid #3b82f6":"1px solid transparent"}}>
                    {APPEL_STAGE_LABELS[i]||`n°${i+1}`}<br/>
                    <span style={{fontWeight:700}}>{fmtEur(Math.abs(v.montant),true)}</span> · {fmtW(v.weekIso)}
                    {isPast&&!isNext&&<span style={{marginLeft:4}}>✓</span>}
                  </div>
                );
              })}
            </div>
          </div>
        ):(
          <div style={{background:"#fef9c3",border:"1px solid #fde68a",borderRadius:8,padding:10,marginBottom:14,fontSize:12,color:"#92400e"}}>
            ⚠️ Aucun flux trouvé dans le Plan Hebdo pour ce lot. Générez les flux prévisionnels depuis la fiche programme.
          </div>
        )}

        {/* IBAN : affichage ou sélecteur CRM */}
        {progIban?(
          <div style={{background:"#f0fdf4",border:"1px solid #86efac",borderRadius:8,padding:"8px 12px",marginBottom:12,fontSize:12}}>
            <span style={{color:"#15803d",fontWeight:700}}>IBAN du programme :</span>
            <span style={{marginLeft:8,fontFamily:"monospace",color:"#1e293b"}}>{progIban}</span>
          </div>
        ):allIbans.length>0&&(
          <div style={{marginBottom:12}}>
            <div style={{fontSize:11,color:"#64748b",marginBottom:4}}>Compte bancaire bénéficiaire (depuis le CRM)</div>
            <select value={selIban} onChange={e=>setSelIban(e.target.value)} style={sinp}>
              <option value="">— Ou saisir manuellement dans l'email —</option>
              {allIbans.map((a,i)=><option key={i} value={a.iban}>{a.label}</option>)}
            </select>
          </div>
        )}

        {/* Email généré */}
        <div style={{marginBottom:14}}>
          <div style={{fontSize:11,color:"#64748b",marginBottom:4}}>Email généré — copiez et collez dans votre client mail</div>
          <textarea value={emailBody} readOnly
            style={{...sinp,height:280,fontFamily:"'Courier New',monospace",fontSize:11,resize:"vertical",lineHeight:1.5}}/>
        </div>

        <div style={{display:"flex",gap:8,justifyContent:"flex-end"}}>
          <button onClick={onClose} style={{background:"#f1f5f9",border:"1px solid #e2e8f0",borderRadius:8,padding:"8px 18px",fontSize:13,cursor:"pointer"}}>Fermer</button>
          <button onClick={handleCopy}
            style={{background:copied?"#16a34a":"#2563eb",color:"#fff",border:"none",borderRadius:8,padding:"8px 22px",fontSize:13,fontWeight:700,cursor:"pointer",transition:"background .2s"}}>
            {copied?"✓ Copié !":"📋 Copier l'email"}
          </button>
        </div>
      </div>
    </div>
  );
}
