// ============================================================
// Documents.jsx — archivio documenti di progetto + upload + viewer
// ============================================================
// FASE A (realizzazione) — revisione documento AI REALE.
const DOC_REVIEW_SYSTEM = "Sei un revisore documentale di una piattaforma di governance degli investimenti industriali (CAPEX). Dato il profilo di un documento (ed eventualmente il suo contenuto), produci una revisione sintetica con: (1) i contenuti attesi per quel tipo di documento, (2) eventuali lacune o anomalie formali da verificare, (3) una raccomandazione finale (approvare / integrare / respingere). Usa elenchi puntati, massimo 6 punti, italiano professionale, nessun preambolo né titoli.";
function buildDocReviewPrompt(d) {
  if (!d) return '';
  const lines = [
    'Documento da revisionare:',
    `- Titolo: ${d.title}`,
    `- Tipo: ${d.type}`,
    `- Stato: ${d.status}`,
    `- Completezza dichiarata: ${Math.round((d.completeness || 0) * 100)}%`,
    `- Progetto: ${d.project || 'n/d'}`,
  ];
  if (d._draftText) {
    lines.push('', 'Contenuto del documento:', '"""', String(d._draftText).slice(0, 4000), '"""');
  }
  lines.push('', 'Esegui la revisione.');
  return lines.join('\n');
}

// FASE D1 — mappa il DTO server (/api/documents/list) alla shape di riga della pagina.
function serverDocToRow(d) {
  return {
    id: d.id,
    title: d.title,
    type: d.type,
    project: d.projectCode || d.projectId || '—',
    status: d.status,
    completeness: typeof d.completeness === 'number' ? d.completeness : 0,
    updated: d.updatedAtText || (d.uploadedAt ? String(d.uploadedAt).slice(0, 10) : (d.createdAt ? String(d.createdAt).slice(0, 10) : '')),
    aiGenerated: !!d.aiGenerated,
    owner: d.ownerPersonaId,
    _serverDoc: true,
    _hasFile: !!d.filePath,
  };
}

function Documents() {
  const { seed, pushToast, user, seedCustom, routeParam } = useStore();
  const [q, setQ] = React.useState('');
  const [status, setStatus] = React.useState('');
  const [sel, setSel] = React.useState(null);
  const [viewer, setViewer] = React.useState(null);
  const [showUpload, setShowUpload] = React.useState(false);
  const [showDraft, setShowDraft] = React.useState(false);
  const [extraDocs, setExtraDocs] = React.useState([]); // bozze AI di sessione (A4)
  const [serverDocs, setServerDocs] = React.useState(null); // null = non ancora caricato → fallback seed

  // FASE 2 RBAC — gating upload (mutation doc.upload).
  const canUpload = window.can('doc.upload', user, seedCustom);

  // FASE D1 — lista REALE cross-progetto dal DB (tenant-scoped). Fallback a seed se la fetch fallisce.
  const refreshServerDocs = React.useCallback(async () => {
    try {
      const res = await fetch('/api/documents/list?hasFile=false&limit=500', {
        headers: { 'X-Actor-Persona-Id': user?.id || '' }, cache: 'no-store',
      });
      if (!res.ok) throw new Error('HTTP ' + res.status);
      const json = await res.json();
      setServerDocs((json.data || []).map(serverDocToRow));
    } catch (err) {
      console.warn('[Documents] fetch list fallita, uso seed:', err);
      setServerDocs(null);
    }
  }, [user?.id]);
  React.useEffect(() => { refreshServerDocs(); }, [refreshServerDocs]);

  const baseDocs = serverDocs || seed.DOCUMENTS;
  // Merge bozze AI sessione + lista reale, dedup per id (le bozze vincono).
  // Ordino la lista reale per data (più recenti in alto) così gli upload appena
  // fatti sono subito visibili (l'API ordina uploadedAt DESC NULLS FIRST → i doc
  // seed senza uploadedAt finirebbero prima). Le bozze AI di sessione restano in cima.
  const allDocs = React.useMemo(() => {
    const dateKey = (d) => String(d?.updated || '').slice(0, 10);
    const sortedBase = [...baseDocs].sort((a, b) => dateKey(b).localeCompare(dateKey(a)));
    const seen = new Set();
    const out = [];
    for (const d of [...extraDocs, ...sortedBase]) {
      if (!d?.id || seen.has(d.id)) continue;
      seen.add(d.id);
      out.push(d);
    }
    return out;
  }, [extraDocs, baseDocs]);
  const docs = allDocs.filter((d) => {
    if (status && d.status !== status) return false;
    if (q && !d.title.toLowerCase().includes(q.toLowerCase())) return false;
    return true;
  });
  const pg = usePaginated(docs, 10);
  React.useEffect(() => { pg.setPage(1); }, [q, status]);

  // Sessione 119 — routeParam auto-select: navigando via
  // `navigate('documents', <id>)` (es. da un'anomalia su un documento nella
  // pagina Alert) apri il detail del documento target invece della sola lista.
  // Human-on-the-loop: l'oggetto è selezionato, l'azione la sceglie l'utente.
  // La lista reale arriva async dal server → applico la selezione una sola
  // volta quando il doc con quell'id è disponibile (ref-guard per non
  // riaprire il detail dopo che l'utente l'ha chiuso).
  const appliedDocParamRef = React.useRef(null);
  React.useEffect(() => {
    if (!routeParam) { appliedDocParamRef.current = null; return; }
    if (appliedDocParamRef.current === routeParam) return;
    const target = allDocs.find((d) => d.id === routeParam);
    if (target) { setSel(target); appliedDocParamRef.current = routeParam; }
  }, [routeParam, allDocs]);

  // FASE D1 — upload reale andato a buon fine → ricarica la lista dal DB.
  function handleUploaded() {
    refreshServerDocs();
    setShowUpload(false);
  }

  // FASE A — bozza generata davvero dall'LLM (vedi GenerateDraftModal).
  function handleDraftGenerated(meta) {
    setExtraDocs(prev => [{
      id: 'ai_' + Date.now(),
      title: meta.title,
      project: meta.project || '—',
      type: meta.type,
      status: 'draft',
      updated: new Date().toISOString().slice(0, 10),
      aiGenerated: true,
      completeness: 0.6,
      owner: user?.id || 'u01',
      _aiDraft: true,
      _draftText: meta.text,
    }, ...prev]);
    setShowDraft(false);
    pushToast({ title: 'Bozza aggiunta', desc: `${meta.title} pronta in stato bozza.`, tone: 'ok' });
  }

  return (
    <div className="page fade-in">
      <div className="page-header">
        <div>
          <div className="eyebrow">Knowledge</div>
          <h1 className="page-title">Documenti di progetto</h1>
          <div className="page-sub">Specifiche, capitolati, offerte, SAL, verbali. L'AI propone bozze, verifica completezza e segnala anomalie formali.</div>
        </div>
        <div className="actions">
          <Btn variant="ai" size="sm" onClick={() => setShowDraft(true)}><Icon name="sparkle" size={12}/> Genera bozza</Btn>
          <Btn
            variant={canUpload ? 'primary' : 'ghost'}
            size="sm"
            disabled={!canUpload}
            onClick={() => { if (canUpload) setShowUpload(true); }}
            title={canUpload ? undefined : window.whyDisabled('doc.upload')}
          ><Icon name="upload" size={12}/> Upload PDF</Btn>
        </div>
      </div>

      <div className="card" style={{ marginBottom: 14 }}>
        <div className="card-body tight row" style={{ gap: 10 }}>
          <div className="row" style={{ gap: 6, flex: 1, padding: '4px 10px', border: '1px solid var(--line)', borderRadius: 6, background: 'var(--bg-2)' }}>
            <Icon name="search" size={12}/>
            <input placeholder="Cerca documento…" value={q} onChange={e=>setQ(e.target.value)} style={{ flex: 1, background: 'transparent', border: 'none', outline: 'none', fontSize: 12 }} />
          </div>
          <select value={status} onChange={e=>setStatus(e.target.value)} style={{ background: 'var(--bg-2)', border: '1px solid var(--line)', padding: '6px 8px', color: 'var(--text-1)', fontSize: 12, borderRadius: 6 }}>
            <option value="">Ogni stato</option><option value="approved">Approvato</option><option value="in_review">In review</option><option value="draft">Bozza</option>
          </select>
        </div>
      </div>

      <div className="grid" style={{ gridTemplateColumns: sel ? '1fr 400px' : '1fr', gap: 14 }}>
        <div className="card">
          <table className="tbl">
            <thead><tr><th>Titolo</th><th>Tipo</th><th>Progetto</th><th style={{width:120}}>Completezza</th><th>Stato</th><th>Aggiornato</th><th></th></tr></thead>
            <tbody>
              {pg.slice.map(d => (
                <tr key={d.id} className="clickable" onClick={()=>setSel(d)}>
                  <td>
                    <div style={{fontWeight:500, display:'flex', alignItems:'center', gap:6}}>
                      <Icon name="file_pdf" size={12}/>
                      {d.title}
                      {d.aiGenerated && <Chip kind="ai">AI</Chip>}
                      {d._uploaded && <Chip kind="info">nuovo</Chip>}
                    </div>
                  </td>
                  <td><Chip>{d.type}</Chip></td>
                  <td className="mono" style={{fontSize:11}}>{d.project}</td>
                  <td><Meter value={d.completeness*100} tone={d.completeness===1?'ok':d.completeness>0.8?'warn':'err'} /></td>
                  <td><Chip kind={d.status==='approved'?'ok':d.status==='in_review'?'warn':'info'} dot>{d.status}</Chip></td>
                  <td className="mono" style={{fontSize:11, color:'var(--text-2)'}}>{fmtDate(d.updated)}</td>
                  <td onClick={(e)=>{ e.stopPropagation(); if (d._serverDoc && d._hasFile) window.open(`/api/documents/${encodeURIComponent(d.id)}/download`, '_blank'); else setViewer(d); }} style={{width:32, textAlign:'right'}}>
                    <button className="btn ghost icon" title="Anteprima"><Icon name="eye" size={13}/></button>
                  </td>
                </tr>
              ))}
            </tbody>
          </table>
          <Pagination {...pg} />
        </div>
        {sel && (
          <div className="card">
            <div className="card-header">
              <div className="title">{sel.title}</div>
              <div className="actions"><button className="btn ghost icon" onClick={()=>setSel(null)}><Icon name="x"/></button></div>
            </div>
            <div className="card-body">
              <div className="row" style={{gap:6, flexWrap:'wrap'}}>
                <Chip>{sel.type}</Chip>
                <Chip kind={sel.status==='approved'?'ok':'warn'} dot>{sel.status}</Chip>
                {sel.aiGenerated && <Chip kind="ai">AI draft</Chip>}
              </div>
              {sel._draftText ? (
                <div style={{marginTop:12, border:'1px solid var(--line)', borderRadius:6, background:'var(--bg-2)', padding:'10px 12px', maxHeight:240, overflow:'auto'}}>
                  <AiInsightBody text={sel._draftText} />
                </div>
              ) : sel._serverDoc && sel._hasFile ? (
                <div
                  className="placeholder-img"
                  style={{marginTop:12, width:'100%', height:160, cursor:'pointer'}}
                  onClick={()=>window.open(`/api/documents/${encodeURIComponent(sel.id)}/download`, '_blank')}
                  title="Apri il PDF reale"
                >
                  Clicca per aprire il PDF
                </div>
              ) : (
                <div
                  className="placeholder-img"
                  style={{marginTop:12, width:'100%', height:160, cursor:'pointer'}}
                  onClick={()=>setViewer(sel)}
                  title="Apri anteprima"
                >
                  Clicca per anteprima PDF
                </div>
              )}
              <div className="row" style={{gap:6, marginTop:12}}>
                {sel._serverDoc && sel._hasFile ? (
                  <>
                    <Btn variant="primary" size="sm" onClick={()=>window.open(`/api/documents/${encodeURIComponent(sel.id)}/download`, '_blank')}><Icon name="eye" size={12}/> Apri PDF</Btn>
                    <a className="btn ghost sm" href={`/api/documents/${encodeURIComponent(sel.id)}/download`} target="_blank" rel="noreferrer"><Icon name="download" size={12}/> Scarica</a>
                  </>
                ) : (
                  <>
                    {!sel._draftText && <Btn variant="primary" size="sm" onClick={()=>setViewer(sel)}><Icon name="eye" size={12}/> Apri PDF</Btn>}
                    <Btn variant="ghost" size="sm" onClick={()=>downloadDocPdf(sel)}><Icon name="download" size={12}/> Scarica</Btn>
                  </>
                )}
              </div>
              <div className="sep" style={{margin:'12px 0 8px'}}/>
              <div className="eyebrow"><Icon name="sparkle" size={11}/> Revisione AI</div>
              <AiInsightPanel
                system={DOC_REVIEW_SYSTEM}
                prompt={buildDocReviewPrompt(sel)}
                runKey={sel.id}
                idleLabel="Revisiona con AI"
                emptyHint="L'agente verifica completezza e contenuti attesi per questo tipo di documento."
                compact
              />
            </div>
          </div>
        )}
      </div>

      {showUpload && <UploadDocModal
        projects={seed.PROJECTS || []}
        docTypes={seedCustom?.DOC_TYPES || []}
        user={user}
        pushToast={pushToast}
        onClose={() => setShowUpload(false)}
        onUploaded={handleUploaded}
      />}

      {showDraft && <GenerateDraftModal projects={seed.PROJECTS || []} onClose={() => setShowDraft(false)} onGenerated={handleDraftGenerated} pushToast={pushToast} />}

      <PDFViewer open={!!viewer} doc={viewer} onClose={() => setViewer(null)} />
    </div>
  );
}

// FASE A — "Genera bozza": modal che redige DAVVERO una bozza di documento via
// LLM (window.aiAsk → /api/ai/invoke). L'utente sceglie tipo, oggetto, progetto
// e indicazioni; l'agente produce il testo, che può essere aggiunto alla lista.
const DRAFT_DOC_TYPES = [
  'Specifica tecnica',
  'Capitolato d\'appalto',
  'Richiesta di offerta (RFQ)',
  'Verbale di riunione',
  'SAL — Stato avanzamento lavori',
  'Nota tecnica',
  'Relazione di valutazione fornitore',
];
const DRAFT_SYSTEM = "Sei un redattore tecnico di una piattaforma di governance degli investimenti industriali (CAPEX). Redigi bozze di documenti professionali in italiano, strutturate con titoli di sezione e paragrafi, pronte per la revisione umana. Tono formale e conciso. Non inventare dati numerici specifici (importi, date, codici): usa segnaposto fra parentesi quadre, es. [importo], [data], dove servono valori reali.";

function GenerateDraftModal({ projects, onClose, onGenerated, pushToast }) {
  const [docType, setDocType] = React.useState(DRAFT_DOC_TYPES[0]);
  const [subject, setSubject] = React.useState('');
  const [projectId, setProjectId] = React.useState('');
  const [brief, setBrief] = React.useState('');
  const [phase, setPhase] = React.useState('form'); // form | loading | done | error
  const [res, setRes] = React.useState(null);
  const [err, setErr] = React.useState(null);

  const proj = projects.find((p) => p.id === projectId);

  async function generate() {
    if (!subject.trim()) { pushToast({ title: 'Inserisci un oggetto', tone: 'warn' }); return; }
    setPhase('loading'); setErr(null);
    try {
      const ctx = [
        `Tipo documento: ${docType}`,
        `Oggetto: ${subject.trim()}`,
        proj ? `Progetto: ${proj.name} (${proj.id})${proj.category ? `, categoria ${proj.category}` : ''}` : null,
        brief.trim() ? `Indicazioni aggiuntive: ${brief.trim()}` : null,
        '',
        'Redigi la bozza completa del documento.',
      ].filter(Boolean).join('\n');
      const r = await window.aiAsk({ system: DRAFT_SYSTEM, messages: [{ role: 'user', content: ctx }] });
      setRes(r); setPhase('done');
    } catch (e) {
      setErr(String(e?.message || e)); setPhase('error');
    }
  }

  const footer = (
    <>
      <Btn variant="ghost" size="sm" onClick={onClose}>Chiudi</Btn>
      {phase === 'done'
        ? <>
            <Btn variant="ghost" size="sm" onClick={generate}><Icon name="refresh" size={11}/> Rigenera</Btn>
            <Btn variant="primary" size="sm" onClick={() => onGenerated({ title: subject.trim(), type: docType, project: projectId || '—', text: res?.text || '' })}><Icon name="plus" size={11}/> Aggiungi alla lista</Btn>
          </>
        : <Btn variant="ai" size="sm" onClick={generate} disabled={phase === 'loading'}><Icon name="sparkle" size={12}/> {phase === 'loading' ? 'Generazione…' : 'Genera bozza'}</Btn>}
    </>
  );

  return (
    <Modal open onClose={onClose} title="Genera bozza con AI" size="lg" footer={footer}>
      <div className="col" style={{ gap: 12 }}>
        <div className="grid grid-2" style={{ gap: 10 }}>
          <div className="field"><label>Tipo documento</label>
            <window.Autocomplete value={docType} onChange={(v) => setDocType(v)} allowClear={false}
              options={DRAFT_DOC_TYPES.map((t) => ({ value: t, label: t }))}
              placeholder="Cerca tipo… (spazio per lista)" testId="draft-doctype-ac" />
          </div>
          <div className="field"><label>Progetto (opzionale)</label>
            <window.Autocomplete value={projectId} onChange={(v) => setProjectId(v)}
              options={projects.map((p) => ({ value: p.id, label: (p.name || p.id), sublabel: p.id }))}
              placeholder="Nessun progetto · cerca… (spazio per lista)" testId="draft-project-ac" />
          </div>
        </div>
        <div className="field"><label>Oggetto</label>
          <input value={subject} onChange={(e) => setSubject(e.target.value)} placeholder="es. Fornitura e installazione cella robotizzata di saldatura" />
        </div>
        <div className="field"><label>Indicazioni per l'agente (opzionale)</label>
          <textarea rows="3" value={brief} onChange={(e) => setBrief(e.target.value)} placeholder="Punti da includere, vincoli, riferimenti normativi…" />
        </div>

        {phase === 'loading' && (
          <div className="ai-insight-thinking" style={{ display: 'flex', alignItems: 'center', gap: 8, fontSize: 12, color: 'var(--text-2)' }}>
            <Icon name="sparkle" size={13} /> <span>L'agente sta redigendo la bozza…</span>
          </div>
        )}
        {phase === 'error' && (
          <div style={{ padding: '8px 10px', border: '1px solid var(--err)', borderRadius: 4, background: 'rgba(192,57,43,0.08)', color: 'var(--err)', fontSize: 11.5 }}>
            <strong>Generazione non riuscita.</strong> {err}
          </div>
        )}
        {phase === 'done' && res && (
          <div>
            <div className="eyebrow" style={{ marginBottom: 6 }}>Bozza generata</div>
            <div style={{ border: '1px solid var(--line)', borderRadius: 6, background: 'var(--bg-2)', padding: '12px 14px', maxHeight: 360, overflow: 'auto' }}>
              <AiInsightBody text={res.text} />
            </div>
            <div style={{ fontSize: 10, color: 'var(--text-3)', marginTop: 6, display: 'inline-flex', alignItems: 'center', gap: 4 }}>
              <Icon name="sparkle" size={9} /> {window.aiSourceLabel ? window.aiSourceLabel(res) : (res.provider || res.source)}
            </div>
          </div>
        )}
      </div>
    </Modal>
  );
}

// FASE D1 — modal upload REALE: file + progetto + tipo (pre-fill da AI classify) →
// POST /api/documents/upload (persiste su DB + storage, indicizza, re-evaluate checklist).
function UploadDocModal({ projects, docTypes, user, pushToast, onClose, onUploaded }) {
  const [file, setFile] = React.useState(null);
  const [projectId, setProjectId] = React.useState('');
  const [docTypeCode, setDocTypeCode] = React.useState('');
  const [title, setTitle] = React.useState('');
  const [classifying, setClassifying] = React.useState(false);
  const [aiHint, setAiHint] = React.useState(null);
  const [uploading, setUploading] = React.useState(false);
  const [over, setOver] = React.useState(false);
  const inputRef = React.useRef(null);

  function onPick(f) {
    if (!f) return;
    setFile(f);
    setTitle(f.name.replace(/\.[^.]+$/, ''));
    // pre-fill progetto se il nome file contiene un codice progetto
    const m = f.name.match(/P-\d{4}-\d{3}/i);
    if (m) {
      const p = projects.find((x) => (x.id || '').toLowerCase() === m[0].toLowerCase() || (x.code || '').toLowerCase() === m[0].toLowerCase());
      if (p) setProjectId(p.id);
    }
    // classificazione AI reale → pre-fill tipo documento
    setClassifying(true); setAiHint(null);
    window.classifyDocReal(f)
      .then((res) => {
        if (res?.docTypeCode) { setDocTypeCode(res.docTypeCode); setAiHint(`AI: ${res.docTypeCode} · ${Math.round((res.confidence || 0) * 100)}%`); }
        else setAiHint(res?.aiError ? 'AI non disponibile — seleziona il tipo manualmente' : 'Tipo non riconosciuto — seleziona manualmente');
      })
      .finally(() => setClassifying(false));
  }

  async function handleUpload() {
    if (!file) { pushToast({ title: 'Seleziona un file PDF', tone: 'warn' }); return; }
    if (!projectId) { pushToast({ title: 'Seleziona il progetto', tone: 'warn' }); return; }
    if (!docTypeCode) { pushToast({ title: 'Seleziona il tipo documento', tone: 'warn' }); return; }
    setUploading(true);
    try {
      const fd = new FormData();
      fd.append('file', file);
      fd.append('projectId', projectId);
      fd.append('docTypeCode', docTypeCode);
      fd.append('title', title.trim() || file.name);
      const res = await fetch('/api/documents/upload', {
        method: 'POST',
        headers: { 'X-Actor-Persona-Id': user?.id || '' },
        body: fd,
      });
      const json = await res.json().catch(() => null);
      if (!res.ok) throw new Error(json?.detail || json?.error || ('HTTP ' + res.status));
      const ce = json.data?.checklistEval;
      pushToast({
        title: 'Documento caricato',
        desc: `${title || file.name} · v${json.data?.fileVersion}${ce ? ` · checklist ${Math.round((ce.scoreBp || 0) / 100)}%` : ''}`,
        tone: 'ok',
      });
      onUploaded(json.data);
    } catch (e) {
      pushToast({ title: 'Upload fallito', desc: String(e?.message || e).slice(0, 200), tone: 'err' });
    } finally {
      setUploading(false);
    }
  }

  return (
    <Modal open onClose={onClose} title="Carica documento" size="md" footer={<>
      <Btn variant="ghost" size="sm" onClick={onClose} disabled={uploading}>Annulla</Btn>
      <Btn variant="primary" size="sm" onClick={handleUpload} disabled={uploading || !file}>{uploading ? 'Caricamento…' : 'Carica'}</Btn>
    </>}>
      <div className="col" style={{ gap: 12 }}>
        <div
          className={`drop ${over ? 'over' : ''}`}
          onClick={() => inputRef.current?.click()}
          onDragOver={(e) => { e.preventDefault(); setOver(true); }}
          onDragLeave={() => setOver(false)}
          onDrop={(e) => { e.preventDefault(); setOver(false); onPick(e.dataTransfer.files?.[0]); }}
          style={{ cursor: 'pointer' }}
        >
          <div className="drop-ico"><Icon name="upload" size={20} /></div>
          <div className="drop-text">
            <div className="drop-t">{file ? file.name : 'Trascina un PDF o clicca per selezionare'}</div>
            <div className="drop-s">{file ? fmtBytes(file.size) : 'PDF · max 50 MB'}</div>
          </div>
          <input ref={inputRef} type="file" accept=".pdf,application/pdf" style={{ display: 'none' }} onChange={(e) => onPick(e.target.files?.[0])} />
        </div>

        {classifying && <div className="ai-insight-thinking" style={{ fontSize: 11.5, color: 'var(--text-2)', display: 'flex', alignItems: 'center', gap: 6 }}><Icon name="sparkle" size={12} /> L'agente classifica il documento…</div>}
        {!classifying && aiHint && <div style={{ fontSize: 11, color: 'var(--text-3)', display: 'flex', alignItems: 'center', gap: 4 }}><Icon name="sparkle" size={10} /> {aiHint}</div>}

        <div className="grid grid-2" style={{ gap: 10 }}>
          <div className="field"><label>Progetto</label>
            <window.Autocomplete value={projectId} onChange={(v) => setProjectId(v)}
              options={projects.map((p) => ({ value: p.id, label: (p.name || p.id), sublabel: (p.code || p.id) }))}
              placeholder="Cerca progetto… (spazio per lista)" testId="upload-project-ac" />
          </div>
          <div className="field"><label>Tipo documento</label>
            <window.Autocomplete value={docTypeCode} onChange={(v) => setDocTypeCode(v)}
              options={docTypes.map((dt) => ({ value: dt.code, label: (dt.name || dt.code), sublabel: dt.code }))}
              placeholder="Cerca tipo… (spazio per lista)" testId="upload-doctype-ac" />
          </div>
        </div>
        <div className="field"><label>Titolo</label>
          <input value={title} onChange={(e) => setTitle(e.target.value)} placeholder="Titolo del documento" />
        </div>
        <div style={{ fontSize: 10.5, color: 'var(--text-3)', lineHeight: 1.5 }}>
          <Icon name="sparkle" size={10} /> Il file viene caricato sul progetto e indicizzato per la ricerca; la classificazione AI pre-compila il tipo (puoi correggerlo).
        </div>
      </div>
    </Modal>
  );
}

Object.assign(window, { Documents });
