/* ============================================================
   ADMIN — Categorie clienti + Coefficienti usura
   Versione con persistenza completa Supabase
   Mapping nomi:
     wear_coefficients:  min_pct, max_pct, aumento_pct → min, max, aumento
     client_categories:  usura_pct → usura
   ============================================================ */

function pct(n){ return (n>0?'+':'') + n + '%'; }

// Mapping coefficienti ↔ DB
function coeffToDb(c){
  return {
    label: c.label,
    min_pct: +c.min,
    max_pct: +c.max,
    aumento_pct: +c.aumento,
  };
}
// Mapping categorie ↔ DB
function catToDb(c){
  return {
    nome: c.nome,
    usura_pct: +c.usura,
    note: c.note || null,
  };
}

function AdminClienti({ coeff, setCoeff, categorie, setCategorie, toast }) {
  const vp = useViewport();
  const [coeffModal, setCoeffModal] = useState(undefined);
  const [catModal, setCatModal] = useState(undefined);
  const [confirm, setConfirm] = useState(null);
  const [hover, setHover] = useState(null);
  const [catSort, setCatSort] = useState('nome-asc'); // nome-asc | nome-desc | usura-asc | usura-desc

  // Categorie ordinate secondo il criterio scelto
  const categorieSorted = React.useMemo(() => {
    const arr = (categorie || []).slice();
    switch (catSort) {
      case 'nome-desc':  return arr.sort((a,b)=>b.nome.localeCompare(a.nome));
      case 'usura-asc':  return arr.sort((a,b)=>(a.usura??0)-(b.usura??0));
      case 'usura-desc': return arr.sort((a,b)=>(b.usura??0)-(a.usura??0));
      case 'nome-asc':
      default:           return arr.sort((a,b)=>a.nome.localeCompare(b.nome));
    }
  }, [categorie, catSort]);

  const saveCoeff = async (c) => {
    const isNew = !coeff.some(x => x.id === c.id);
    if (window.SF_CONFIG.useSupabase) {
      try {
        if (isNew) {
          const row = await window.DataAPI.insert('wear_coefficients', coeffToDb(c));
          c = { ...c, id: row.id };
        } else {
          await window.DataAPI.update('wear_coefficients', c.id, coeffToDb(c));
        }
      } catch (e) {
        console.error('saveCoeff', e);
        toast('Errore salvataggio: ' + (e?.message || 'sconosciuto'));
        return;
      }
    }
    setCoeff(prev => {
      const next = prev.some(x=>x.id===c.id) ? prev.map(x=>x.id===c.id?c:x) : [...prev, c];
      return next.sort((a,b)=>a.min-b.min);
    });
    setCoeffModal(undefined);
    toast(isNew ? 'Fascia aggiunta' : 'Fascia aggiornata');
  };

  const saveCat = async (c) => {
    const isNew = !categorie.some(x => x.id === c.id);
    if (window.SF_CONFIG.useSupabase) {
      try {
        if (isNew) {
          const row = await window.DataAPI.insert('client_categories', catToDb(c));
          c = { ...c, id: row.id };
        } else {
          await window.DataAPI.update('client_categories', c.id, catToDb(c));
        }
      } catch (e) {
        console.error('saveCat', e);
        toast('Errore salvataggio: ' + (e?.message || 'sconosciuto'));
        return;
      }
    }
    setCategorie(prev => prev.some(x=>x.id===c.id) ? prev.map(x=>x.id===c.id?c:x) : [...prev, c]);
    setCatModal(undefined);
    toast(isNew ? 'Categoria cliente aggiunta' : 'Categoria aggiornata');
  };

  const removeCoeff = async (c) => {
    if (window.SF_CONFIG.useSupabase) {
      try { await window.DataAPI.remove('wear_coefficients', c.id); }
      catch (e) { console.error(e); toast('Errore eliminazione'); return; }
    }
    setCoeff(prev=>prev.filter(x=>x.id!==c.id));
    setConfirm(null);
    toast('Fascia rimossa');
  };

  const removeCat = async (c) => {
    if (window.SF_CONFIG.useSupabase) {
      try { await window.DataAPI.remove('client_categories', c.id); }
      catch (e) { console.error(e); toast('Errore eliminazione'); return; }
    }
    setCategorie(prev=>prev.filter(x=>x.id!==c.id));
    setConfirm(null);
    toast('Categoria rimossa');
  };

  return (
    <>
      {/* ---- Coefficienti usura ---- */}
      <div style={{ display:'flex', alignItems:'flex-start', justifyContent:'space-between', marginBottom:14, gap:12, flexWrap:'wrap' }}>
        <div style={{ minWidth:0, flex:1 }}>
          <h2 style={{ margin:0, fontFamily:'var(--font-display)', fontSize: vp.isMobile?17:19, fontWeight:800 }}>Coefficienti di usura</h2>
          <div style={{ fontSize: vp.isMobile?12.5:13, color:'var(--ink-3)', marginTop:2, maxWidth:560 }}>
            {vp.isMobile ? 'Maggiorazione % sulla tariffa di noleggio per ogni fascia.' : 'Per ogni fascia di usura, la maggiorazione % applicata alla tariffa di noleggio (breve e lungo termine). Valori indicativi, modificabili.'}
          </div>
        </div>
        <Btn variant="ghost" icon="plus" size={vp.isMobile?'sm':'md'} onClick={()=>setCoeffModal(null)}>{vp.isMobile?'Nuova':'Nuova fascia'}</Btn>
      </div>

      {vp.isMobile ? (
        /* Coefficienti: card list mobile */
        <div style={{ display:'flex', flexDirection:'column', gap:10, marginBottom:26 }}>
          {coeff.map(c => (
            <div key={c.id} style={{ background:'var(--surface)', border:'1px solid var(--line)', borderRadius:'var(--r-lg)', padding:'12px 14px', boxShadow:'var(--sh-1)' }}>
              <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', gap:10, marginBottom:6 }}>
                <div style={{ fontSize:14, fontWeight:800, minWidth:0, whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{c.label}</div>
                <span style={{ fontFamily:'var(--font-display)', fontSize:18, fontWeight:800, color: c.aumento>0?'var(--red)':'var(--st-disponibile)', flexShrink:0 }}>{pct(c.aumento)}</span>
              </div>
              <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', gap:8 }}>
                <span style={{ fontSize:12, fontWeight:600, color:'var(--ink-3)' }}>Range usura: <b style={{ color:'var(--ink-2)' }}>{c.min}% – {c.max}%</b></span>
                <div style={{ display:'flex', gap:6 }}>
                  <button onClick={()=>setCoeffModal(c)} title="Modifica" style={iconBtn}><Icon name="edit" size={15} /></button>
                  <button onClick={()=>setConfirm({kind:'coeff', item:c})} title="Elimina" style={{ ...iconBtn, color:'var(--red)', borderColor:'var(--red-tint-2)' }}><Icon name="x" size={15} /></button>
                </div>
              </div>
            </div>
          ))}
        </div>
      ) : (
      <div style={{ background:'var(--surface)', border:'1px solid var(--line)', borderRadius:'var(--r-lg)', overflow:'hidden', boxShadow:'var(--sh-1)', marginBottom:34 }}>
        <div style={{ display:'grid', gridTemplateColumns:'1.4fr 1fr 1fr 96px', gap:14, padding:'12px 20px', background:'var(--surface-2)', borderBottom:'1px solid var(--line)',
          fontSize:11, fontWeight:800, color:'var(--ink-3)', textTransform:'uppercase', letterSpacing:'.04em' }}>
          <span>Fascia</span><span>Range usura</span><span>Maggiorazione</span><span style={{ textAlign:'right' }}>Azioni</span>
        </div>
        {coeff.map((c,i)=>(
          <div key={c.id} onMouseEnter={()=>setHover('co'+c.id)} onMouseLeave={()=>setHover(null)}
            style={{ display:'grid', gridTemplateColumns:'1.4fr 1fr 1fr 96px', gap:14, padding:'12px 20px', alignItems:'center',
              borderBottom: i<coeff.length-1?'1px solid var(--line-2)':'none', background:hover==='co'+c.id?'var(--surface-2)':'transparent' }}>
            <span style={{ fontSize:14, fontWeight:700 }}>{c.label}</span>
            <span style={{ fontSize:13.5, fontWeight:600, color:'var(--ink-2)' }}>{c.min}% – {c.max}%</span>
            <span style={{ fontFamily:'var(--font-display)', fontSize:16, fontWeight:800, color: c.aumento>0?'var(--red)':'var(--st-disponibile)' }}>{pct(c.aumento)}</span>
            <div style={{ display:'flex', gap:6, justifyContent:'flex-end', opacity:hover==='co'+c.id?1:0, transition:'.12s' }}>
              <button onClick={()=>setCoeffModal(c)} title="Modifica" style={iconBtn}><Icon name="edit" size={15} /></button>
              <button onClick={()=>setConfirm({kind:'coeff', item:c})} title="Elimina" style={{ ...iconBtn, color:'var(--red)', borderColor:'var(--red-tint-2)' }}><Icon name="x" size={15} /></button>
            </div>
          </div>
        ))}
      </div>
      )}

      {/* ---- Categorie clienti ---- */}
      <div style={{ display:'flex', alignItems:'flex-start', justifyContent:'space-between', marginBottom:14, gap:12, flexWrap:'wrap' }}>
        <div style={{ minWidth:0, flex:1 }}>
          <h2 style={{ margin:0, fontFamily:'var(--font-display)', fontSize: vp.isMobile?17:19, fontWeight:800 }}>Categorie clienti</h2>
          <div style={{ fontSize: vp.isMobile?12.5:13, color:'var(--ink-3)', marginTop:2, maxWidth:560 }}>
            {vp.isMobile ? 'Il settore determina l\'usura e la maggiorazione sul noleggio.' : 'Il settore del cliente determina l\'usura stimata del mezzo. In base alla fascia di usura si applica la maggiorazione sul noleggio.'}
          </div>
        </div>
        <div style={{ display:'flex', alignItems:'center', gap:8, flexWrap:'wrap' }}>
          <div style={{ position:'relative' }}>
            <select value={catSort} onChange={e=>setCatSort(e.target.value)}
              style={{ appearance:'none', padding:'8px 30px 8px 12px', fontSize:13, fontWeight:600, borderRadius:'var(--r-md)',
                border:'1.5px solid var(--line)', background:'var(--surface-2)', color:'var(--ink-2)', outline:'none', cursor:'pointer' }}>
              <option value="nome-asc">Nome A→Z</option>
              <option value="nome-desc">Nome Z→A</option>
              <option value="usura-asc">Usura ↑</option>
              <option value="usura-desc">Usura ↓</option>
            </select>
            <Icon name="chevDown" size={15} style={{ position:'absolute', right:10, top:'50%', transform:'translateY(-50%)', color:'var(--ink-3)', pointerEvents:'none' }} />
          </div>
          <Btn icon="plus" size={vp.isMobile?'sm':'md'} onClick={()=>setCatModal(null)}>{vp.isMobile?'Nuova':'Nuova categoria'}</Btn>
        </div>
      </div>

      {vp.isMobile ? (
        /* Categorie: card list mobile */
        <div style={{ display:'flex', flexDirection:'column', gap:10 }}>
          {categorieSorted.map(c => {
            const m = maggiorazioneFor(c.usura, coeff);
            return (
              <div key={c.id} style={{ background:'var(--surface)', border:'1px solid var(--line)', borderRadius:'var(--r-lg)', padding:'12px 14px', boxShadow:'var(--sh-1)' }}>
                <div style={{ display:'flex', alignItems:'center', justifyContent:'space-between', gap:10, marginBottom:8 }}>
                  <div style={{ minWidth:0, flex:1 }}>
                    <div style={{ fontSize:14, fontWeight:800, whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{c.nome}</div>
                    {c.note && <div style={{ fontSize:11.5, color:'var(--ink-4)', marginTop:1, whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{c.note}</div>}
                  </div>
                  <div style={{ display:'flex', gap:6, flexShrink:0 }}>
                    <button onClick={()=>setCatModal(c)} title="Modifica" style={iconBtn}><Icon name="edit" size={15} /></button>
                    <button onClick={()=>setConfirm({kind:'cat', item:c})} title="Elimina" style={{ ...iconBtn, color:'var(--red)', borderColor:'var(--red-tint-2)' }}><Icon name="x" size={15} /></button>
                  </div>
                </div>
                <div style={{ display:'flex', alignItems:'center', gap:14, flexWrap:'wrap' }}>
                  <div style={{ display:'flex', alignItems:'center', gap:8, flex:1, minWidth:130 }}>
                    <span style={{ fontSize:11, fontWeight:700, color:'var(--ink-3)' }}>Usura</span>
                    <div style={{ flex:1, height:6, borderRadius:99, background:'var(--line-2)', overflow:'hidden', minWidth:40 }}>
                      <div style={{ width:c.usura+'%', height:'100%', background: c.usura>50?'var(--red)':c.usura>30?'var(--st-prenotato)':'var(--st-disponibile)' }} />
                    </div>
                    <span style={{ fontSize:13, fontWeight:700 }}>{c.usura}%</span>
                  </div>
                  <div style={{ display:'flex', alignItems:'baseline', gap:5 }}>
                    <span style={{ fontFamily:'var(--font-display)', fontSize:16, fontWeight:800, color: m.aumento>0?'var(--red)':'var(--st-disponibile)' }}>{pct(m.aumento)}</span>
                    {m.fascia && <span style={{ fontSize:10.5, fontWeight:700, color:'var(--ink-4)' }}>{m.fascia.label}</span>}
                  </div>
                </div>
              </div>
            );
          })}
          <button onClick={()=>setCatModal(null)}
            style={{ padding:'12px 14px', color:'var(--red)', fontSize:13, fontWeight:700,
              border:'1.5px dashed var(--red-tint-2)', borderRadius:'var(--r-lg)', background:'var(--red-tint)',
              display:'flex', alignItems:'center', justifyContent:'center', gap:8 }}>
            <Icon name="plus" size={16} /> Aggiungi categoria
          </button>
        </div>
      ) : (
      <div style={{ background:'var(--surface)', border:'1px solid var(--line)', borderRadius:'var(--r-lg)', overflow:'hidden', boxShadow:'var(--sh-1)' }}>
        <div style={{ display:'grid', gridTemplateColumns:'1.6fr 1fr 1fr 96px', gap:14, padding:'12px 20px', background:'var(--surface-2)', borderBottom:'1px solid var(--line)',
          fontSize:11, fontWeight:800, color:'var(--ink-3)', textTransform:'uppercase', letterSpacing:'.04em' }}>
          <span>Categoria / Settore</span><span>Usura stimata</span><span>Maggiorazione noleggio</span><span style={{ textAlign:'right' }}>Azioni</span>
        </div>
        {categorieSorted.map((c,i)=>{
          const m = maggiorazioneFor(c.usura, coeff);
          return (
            <div key={c.id} onMouseEnter={()=>setHover('cc'+c.id)} onMouseLeave={()=>setHover(null)}
              style={{ display:'grid', gridTemplateColumns:'1.6fr 1fr 1fr 96px', gap:14, padding:'13px 20px', alignItems:'center',
                borderBottom: i<categorie.length-1?'1px solid var(--line-2)':'none', background:hover==='cc'+c.id?'var(--surface-2)':'transparent' }}>
              <div style={{ minWidth:0 }}>
                <div style={{ fontSize:14, fontWeight:700 }}>{c.nome}</div>
                {c.note && <div style={{ fontSize:12, color:'var(--ink-4)', marginTop:1, whiteSpace:'nowrap', overflow:'hidden', textOverflow:'ellipsis' }}>{c.note}</div>}
              </div>
              <div style={{ display:'flex', alignItems:'center', gap:9 }}>
                <div style={{ width:54, height:7, borderRadius:99, background:'var(--line-2)', overflow:'hidden', flexShrink:0 }}>
                  <div style={{ width:c.usura+'%', height:'100%', background: c.usura>50?'var(--red)':c.usura>30?'var(--st-prenotato)':'var(--st-disponibile)' }} />
                </div>
                <span style={{ fontSize:13.5, fontWeight:700 }}>{c.usura}%</span>
              </div>
              <span style={{ display:'inline-flex', alignItems:'center', gap:7, justifySelf:'start' }}>
                <span style={{ fontFamily:'var(--font-display)', fontSize:16, fontWeight:800, color: m.aumento>0?'var(--red)':'var(--st-disponibile)' }}>{pct(m.aumento)}</span>
                {m.fascia && <span style={{ fontSize:11, fontWeight:700, color:'var(--ink-4)' }}>{m.fascia.label}</span>}
              </span>
              <div style={{ display:'flex', gap:6, justifyContent:'flex-end', opacity:hover==='cc'+c.id?1:0, transition:'.12s' }}>
                <button onClick={()=>setCatModal(c)} title="Modifica" style={iconBtn}><Icon name="edit" size={15} /></button>
                <button onClick={()=>setConfirm({kind:'cat', item:c})} title="Elimina" style={{ ...iconBtn, color:'var(--red)', borderColor:'var(--red-tint-2)' }}><Icon name="x" size={15} /></button>
              </div>
            </div>
          );
        })}
        <button onClick={()=>setCatModal(null)} style={{ width:'100%', display:'flex', alignItems:'center', gap:10, padding:'14px 20px', color:'var(--ink-3)', fontSize:13.5, fontWeight:700, borderTop:'1px dashed var(--line)', background:'var(--surface-2)' }}
          onMouseEnter={e=>e.currentTarget.style.color='var(--red)'} onMouseLeave={e=>e.currentTarget.style.color='var(--ink-3)'}>
          <Icon name="plus" size={17} /> Aggiungi categoria cliente
        </button>
      </div>
      )}

      {coeffModal!==undefined && <CoeffModal data={coeffModal} onClose={()=>setCoeffModal(undefined)} onSave={saveCoeff} />}
      {catModal!==undefined && <ClienteCatModal data={catModal} coeff={coeff} onClose={()=>setCatModal(undefined)} onSave={saveCat} />}
      {confirm && <ConfirmDialog
        title={confirm.kind==='coeff'?'Eliminare la fascia?':'Eliminare la categoria?'}
        message={<>Stai per eliminare <b>{confirm.item.label||confirm.item.nome}</b>.</>}
        confirmLabel="Elimina" onConfirm={()=>confirm.kind==='coeff'?removeCoeff(confirm.item):removeCat(confirm.item)} onClose={()=>setConfirm(null)} />}
    </>
  );
}

function CoeffModal({ data, onClose, onSave }) {
  const isNew = !data;
  const [label, setLabel] = useState(data?.label || '');
  const [min, setMin] = useState(data?data.min:'');
  const [max, setMax] = useState(data?data.max:'');
  const [aumento, setAumento] = useState(data?data.aumento:'');
  const valid = label.trim() && min!=='' && max!=='' && aumento!=='';
  const submit = ()=>{ if(!valid) return; onSave({ id:data?.id, label:label.trim(), min:+min, max:+max, aumento:+aumento }); };
  return (
    <ModalShell onClose={onClose} width={460} title={isNew?'Nuova fascia di usura':'Modifica fascia'} subtitle="Range di usura e maggiorazione applicata">
      <div style={{ display:'flex', flexDirection:'column', gap:16 }}>
        <Field label="Etichetta fascia" required>
          <input value={label} onChange={e=>setLabel(e.target.value)} placeholder="es. Usura elevata" style={inputStyle} autoFocus />
        </Field>
        <div style={{ display:'grid', gridTemplateColumns:'1fr 1fr 1fr', gap:14 }}>
          <Field label="Da (%)" required>
            <input value={min} onChange={e=>setMin(e.target.value.replace(/[^\d]/g,''))} placeholder="0" style={inputStyle} />
          </Field>
          <Field label="A (%)" required>
            <input value={max} onChange={e=>setMax(e.target.value.replace(/[^\d]/g,''))} placeholder="100" style={inputStyle} />
          </Field>
          <Field label="Maggiorazione (%)" required>
            <input value={aumento} onChange={e=>setAumento(e.target.value.replace(/[^\d]/g,''))} placeholder="0" style={inputStyle} />
          </Field>
        </div>
      </div>
      <div style={{ display:'flex', gap:12, marginTop:22 }}>
        <Btn variant="ghost" full onClick={onClose}>Annulla</Btn>
        <Btn full icon="check" onClick={submit} disabled={!valid}>{isNew?'Crea fascia':'Salva'}</Btn>
      </div>
    </ModalShell>
  );
}

function ClienteCatModal({ data, coeff, onClose, onSave }) {
  const isNew = !data;
  const [nome, setNome] = useState(data?.nome || '');
  const [usura, setUsura] = useState(data?data.usura:30);
  const [note, setNote] = useState(data?.note || '');
  const m = maggiorazioneFor(+usura, coeff);
  const valid = nome.trim() && usura!=='';
  const submit = ()=>{ if(!valid) return; onSave({ id:data?.id, nome:nome.trim(), usura:+usura, note:note.trim() }); };
  return (
    <ModalShell onClose={onClose} width={480} title={isNew?'Nuova categoria cliente':'Modifica categoria'} subtitle="Settore e usura stimata del mezzo">
      <div style={{ display:'flex', flexDirection:'column', gap:16 }}>
        <Field label="Nome / Settore" required>
          <input value={nome} onChange={e=>setNome(e.target.value)} placeholder="es. Industria alimentare" style={inputStyle} autoFocus />
        </Field>
        <Field label={`Usura stimata — ${usura}%`} required>
          <input type="range" min="0" max="100" step="1" value={usura} onChange={e=>setUsura(e.target.value)} style={{ width:'100%', accentColor:'var(--red)' }} />
          <div style={{ display:'flex', justifyContent:'space-between', marginTop:8, padding:'10px 13px', background:'var(--surface-2)', borderRadius:'var(--r-md)' }}>
            <span style={{ fontSize:13, fontWeight:600, color:'var(--ink-2)' }}>Maggiorazione noleggio</span>
            <span style={{ fontWeight:800, color: m.aumento>0?'var(--red)':'var(--st-disponibile)' }}>{pct(m.aumento)} {m.fascia?`· ${m.fascia.label}`:''}</span>
          </div>
        </Field>
        <Field label="Note (facoltative)">
          <input value={note} onChange={e=>setNote(e.target.value)} placeholder="es. ingresso/uscita celle frigo" style={inputStyle} />
        </Field>
      </div>
      <div style={{ display:'flex', gap:12, marginTop:22 }}>
        <Btn variant="ghost" full onClick={onClose}>Annulla</Btn>
        <Btn full icon="check" onClick={submit} disabled={!valid}>{isNew?'Crea categoria':'Salva'}</Btn>
      </div>
    </ModalShell>
  );
}

Object.assign(window, { AdminClienti, CoeffModal, ClienteCatModal, pct });