/* global React, API, useApp */
const { useState, useEffect, useCallback } = React;

const fmtEur = v => v == null ? '—' : `€${Number(v).toLocaleString('nl-NL',{minimumFractionDigits:2,maximumFractionDigits:2})}`;
const SOURCE_LABELS = { recurring:'Recurring', passthrough:'Passthrough', time:'Time', manual:'Manual' };
const SOURCE_COLORS = { recurring:'var(--teal)', passthrough:'var(--amber)', time:'var(--fg-muted)', manual:'var(--ember)' };

function QueueItem({ item, onApprove, onReject, onDelete }) {
  const subtotal = item.quantity * item.unit_price;
  const total    = subtotal * (1 + item.vat_rate);
  return (
    <div style={{display:'grid',gridTemplateColumns:'90px 1fr 60px 80px 80px 110px',gap:8,alignItems:'center',
      padding:'8px 0',borderBottom:'1px solid var(--border)',fontSize:12}}>
      <span style={{fontSize:10,fontFamily:'var(--font-mono)',color:SOURCE_COLORS[item.source_type]||'var(--fg-muted)',
        textTransform:'uppercase',letterSpacing:'0.08em'}}>
        {SOURCE_LABELS[item.source_type]||item.source_type}
      </span>
      <span style={{fontWeight:item.approved===1?500:400,color:item.approved===0?'var(--fg-subtle)':'inherit'}}>
        {item.description}
      </span>
      <span className="mono" style={{color:'var(--fg-subtle)',fontSize:11}}>{item.quantity}×</span>
      <span className="mono" style={{textAlign:'right'}}>{fmtEur(item.unit_price)}</span>
      <span className="mono" style={{textAlign:'right',fontWeight:600}}>{fmtEur(total)}</span>
      <div style={{display:'flex',gap:4,justifyContent:'flex-end'}}>
        {item.approved === 1
          ? <span style={{fontSize:10,color:'var(--teal)',fontFamily:'var(--font-mono)'}}>✓ approved</span>
          : item.approved === 0
          ? <span style={{fontSize:10,color:'var(--fg-subtle)',fontFamily:'var(--font-mono)'}}>✗ rejected</span>
          : <>
              <button className="btn btn--primary btn--sm" style={{padding:'2px 8px',fontSize:10}} onClick={() => onApprove(item.id)}>✓</button>
              <button className="btn btn--ghost btn--sm" style={{padding:'2px 8px',fontSize:10}} onClick={() => onReject(item.id)}>✗</button>
            </>
        }
        <button className="btn btn--danger btn--sm" style={{padding:'2px 6px',fontSize:10}} onClick={() => onDelete(item.id)}>×</button>
      </div>
    </div>
  );
}

function AddItemForm({ companyId, companies, onAdded, onCancel }) {
  const [f, setF] = useState({ description:'', quantity:1, unit_price:'', vat_rate:0.21, source_type:'manual' });
  const [busy, setBusy] = useState(false);
  const { toast } = useApp();
  const up = k => e => setF(p => ({...p,[k]:e.target.value}));

  async function submit() {
    if (!f.description || !f.unit_price) { toast('Description and price required','error'); return; }
    setBusy(true);
    try {
      await API.post('/billing-queue', { company_id: companyId, ...f,
        quantity: Number(f.quantity), unit_price: Number(f.unit_price), vat_rate: Number(f.vat_rate) });
      onAdded();
    } catch(e) { toast(e.error||'Error','error'); }
    finally { setBusy(false); }
  }

  return (
    <div style={{display:'grid',gridTemplateColumns:'120px 1fr 60px 90px 70px auto auto',gap:6,alignItems:'end',marginTop:10,padding:'10px 0',borderTop:'1px solid var(--border)'}}>
      <select className="field-select" style={{fontSize:11}} value={f.source_type} onChange={up('source_type')}>
        <option value="manual">Manual</option>
        <option value="time">Time</option>
        <option value="recurring">Recurring</option>
      </select>
      <input className="field-input" style={{fontSize:11}} placeholder="Description" value={f.description} onChange={up('description')} />
      <input className="field-input mono" style={{fontSize:11}} type="number" step="0.01" min="0.01" placeholder="Qty" value={f.quantity} onChange={up('quantity')} />
      <input className="field-input mono" style={{fontSize:11}} type="number" step="0.01" placeholder="Unit price (ex VAT)" value={f.unit_price} onChange={up('unit_price')} />
      <select className="field-select" style={{fontSize:11}} value={f.vat_rate} onChange={up('vat_rate')}>
        <option value="0.21">21%</option>
        <option value="0.09">9%</option>
        <option value="0.00">0%</option>
      </select>
      <button className="btn btn--primary btn--sm" onClick={submit} disabled={busy}>{busy?'…':'Add'}</button>
      <button className="btn btn--ghost btn--sm" onClick={onCancel}>✕</button>
    </div>
  );
}

function CustomerQueue({ customer, companies, onInvoiced }) {
  const [items, setItems]   = useState([]);
  const [adding, setAdding] = useState(false);
  const [busy, setBusy]     = useState(false);
  const { toast } = useApp();

  const load = useCallback(() => {
    API.get(`/billing-queue?company_id=${customer.company_id}`).then(setItems).catch(()=>{});
  }, [customer.company_id]);
  useEffect(() => { load(); }, [load]);

  async function approve(id)   { await API.patch(`/billing-queue/${id}`, { approved: 1 }); load(); }
  async function reject(id)    { await API.patch(`/billing-queue/${id}`, { approved: 0 }); load(); }
  async function del(id)       { await API.del(`/billing-queue/${id}`).catch(()=>{}); load(); }
  async function approveAll()  {
    const pending = items.filter(i => i.approved === null);
    await Promise.all(pending.map(i => API.patch(`/billing-queue/${i.id}`, { approved: 1 })));
    load();
  }
  async function runInvoice() {
    setBusy(true);
    try {
      const result = await API.post('/billing-queue/run', { company_id: customer.company_id });
      toast(`Invoice ${result.invoice_number} created (${result.items} lines)`);
      load();
      onInvoiced();
    } catch(e) { toast(e.error||'Error','error'); }
    finally { setBusy(false); }
  }

  const pending  = items.filter(i => i.approved === null);
  const approved = items.filter(i => i.approved === 1);
  const subtotal = approved.reduce((s,i) => s + i.quantity * i.unit_price, 0);
  const total    = items.reduce((s,i) => s + i.quantity * i.unit_price * (1 + i.vat_rate), 0);

  return (
    <div className="card" style={{margin:0,marginBottom:16}}>
      <div style={{display:'flex',alignItems:'center',justifyContent:'space-between',marginBottom:12}}>
        <div>
          <div style={{fontWeight:600,fontSize:14}}>{customer.company_name}</div>
          <div style={{fontSize:11,color:'var(--fg-subtle)',fontFamily:'var(--font-mono)',marginTop:2}}>
            {customer.total_items} item{customer.total_items!==1?'s':''} · {approved.length} approved · {pending.length} pending
          </div>
        </div>
        <div style={{display:'flex',gap:8,alignItems:'center'}}>
          <span style={{fontSize:13,fontWeight:700,fontFamily:'var(--font-mono)',color:'var(--teal)'}}>{fmtEur(total)}</span>
          {pending.length > 0 && <button className="btn btn--ghost btn--sm" onClick={approveAll}>✓ Approve all</button>}
          {approved.length > 0 && <button className="btn btn--primary btn--sm" onClick={runInvoice} disabled={busy}>{busy?'Creating…':'Run invoice'}</button>}
          <button className="btn btn--ghost btn--sm" onClick={() => setAdding(v=>!v)}>+ Add item</button>
        </div>
      </div>

      <div style={{display:'grid',gridTemplateColumns:'90px 1fr 60px 80px 80px 110px',gap:8,
        padding:'6px 0',borderBottom:'1px solid var(--border)',marginBottom:4}}>
        {['Source','Description','Qty','Price','Total incl.',''].map((h,i) =>
          <span key={i} style={{fontSize:10,fontFamily:'var(--font-mono)',color:'var(--fg-subtle)',textTransform:'uppercase',
            letterSpacing:'0.08em',textAlign:i>=3&&i<=4?'right':'left'}}>{h}</span>
        )}
      </div>

      {items.length === 0 && <div style={{fontSize:12,color:'var(--fg-subtle)',padding:'12px 0'}}>Queue is empty.</div>}
      {items.map(item => (
        <QueueItem key={item.id} item={item} onApprove={approve} onReject={reject} onDelete={del} />
      ))}

      {adding && <AddItemForm companyId={customer.company_id} companies={companies} onAdded={()=>{load();setAdding(false);}} onCancel={()=>setAdding(false)} />}
    </div>
  );
}

function BillingQueue({ companies }) {
  const [summary, setSummary]   = useState([]);
  const [tick,    setTick]      = useState(0);
  const reload = () => { API.get('/billing-queue').then(setSummary).catch(()=>{}); setTick(t=>t+1); };
  useEffect(() => { reload(); }, []);

  return (
    <div className="page">
      <div className="page-header">
        <h1 className="page-title">Billing Queue</h1>
        <div style={{fontSize:12,color:'var(--fg-subtle)'}}>
          Items waiting to be invoiced — approve lines then run the invoice per customer.
        </div>
      </div>

      {summary.length === 0 && (
        <div className="card" style={{margin:0,color:'var(--fg-subtle)',fontSize:13,textAlign:'center',padding:40}}>
          No pending items. Passthrough allocations and manually added items will appear here.
        </div>
      )}

      {summary.map(c => (
        <CustomerQueue key={`${c.company_id}-${tick}`} customer={c} companies={companies} onInvoiced={reload} />
      ))}
    </div>
  );
}
