/* ===== Painel de desempenho da frota (14/11) ========================
   Pedido dele: "um dashboard de desempenho por cada caminhão e um
   consolidado mostrando a média. KM rodado por dia, semana, mês,
   autonomia, oficina... para saber o melhor caminhão da frota, e se
   algum melhorou o km/L com o tempo."

   TUDO AQUI É MEDIDO, NÃO ESTIMADO. Sai das viagens lançadas e dos
   serviços lançados na oficina. Caminhão sem lançamento aparece como
   "sem dado" — nunca com número inventado, que é o problema que esta
   área veio resolver.

   A JANELA
   O período é escolhido na tela (30, 60 ou 90 dias). A tendência
   compara a janela atual com a janela anterior do mesmo tamanho:
   é assim que "melhorou de 2,3 para 2,5" aparece sozinho.

   A NOTA
   Três pedaços, com peso, e o critério está escrito na tela:
     consumo medido      50%   quanto mais km por litro, melhor
     dias parado         30%   quanto menos tempo na oficina, melhor
     custo de oficina    20%   por km rodado
   Quem não tem viagem lançada fica fora do ranking em vez de levar
   nota zero por falta de dado.

   ⚠️ A AUTONOMIA depende do tamanho do tanque, que ninguém informou.
   O campo é editável e começa em 400 L, que é o valor que aparece nos
   lançamentos de exemplo. Está marcado como pergunta.
   ================================================================== */

const FP_TANQUE_PADRAO = 400;

/* dd/mm/aaaa -> Date. Lançamento com data torta é ignorado em vez de
   virar 1970 e sujar a conta. */
function fpData(br){
  const p = String(br||'').trim().split('/');
  if(p.length !== 3) return null;
  const d = new Date(Number(p[2]), Number(p[1])-1, Number(p[0]));
  return isNaN(d.getTime()) ? null : d;
}
const fpDiasAtras = (n) => { const d = new Date(); d.setHours(0,0,0,0); d.setDate(d.getDate()-n); return d; };
const fpNaJanela = (br, de, ate) => { const d = fpData(br); return d && d >= de && d < ate; };

function FrotaPainel({fleet, regs, manut}){
  const [dias,setDias] = usePersist('fp-janela', 30);
  const [tanque,setTanque] = usePersist('fp-tanque', FP_TANQUE_PADRAO);

  const hoje = new Date(); hoje.setHours(0,0,0,0); hoje.setDate(hoje.getDate()+1);
  const inicio = fpDiasAtras(dias);
  const inicioAnterior = fpDiasAtras(dias*2);

  const oficina = manut || [];

  const linhas = (fleet||[]).map(t=>{
    const viagens  = (regs||[]).filter(r=>r.truck===t.id && fpNaJanela(r.data, inicio, hoje));
    const anterior = (regs||[]).filter(r=>r.truck===t.id && fpNaJanela(r.data, inicioAnterior, inicio));
    const servicos = oficina.filter(h=>h.truck===t.id && fpNaJanela(h.data, inicio, hoje));

    const km    = viagens.reduce((s,r)=>s+(r.km||0),0);
    const litros= viagens.reduce((s,r)=>s+csGasto(r),0);
    const kml   = litros>0 ? km/litros : 0;
    const kmlAnt= (()=>{ const k=anterior.reduce((s,r)=>s+(r.km||0),0), l=anterior.reduce((s,r)=>s+csGasto(r),0);
                         return l>0 ? k/l : 0; })();
    const diasParado = servicos.reduce((s,h)=>s+(h.dias||0),0);
    const custoOf    = servicos.reduce((s,h)=>s+(h.custo||0),0);

    return {t, viagens:viagens.length, km, litros, kml, kmlAnt,
      tendencia: (kml>0 && kmlAnt>0) ? (kml/kmlAnt-1)*100 : null,
      kmDia: km/dias, kmSemana: km/dias*7, kmMes: km/dias*30,
      autonomia: kml>0 ? kml*(tanque||0) : 0,
      diasParado, custoOf,
      custoOfKm: km>0 ? custoOf/km : 0,
      temDado: viagens.length>0};
  });

  const comDado = linhas.filter(l=>l.temDado);

  /* nota só entre quem tem dado, para não punir quem ninguém lançou */
  const max = (f) => Math.max(0.0001, ...comDado.map(f));
  const notas = comDado.map(l=>{
    const nConsumo = l.kml / max(x=>x.kml) * 100;
    const piorParado = max(x=>x.diasParado);
    const nParado = piorParado>0 ? (1 - l.diasParado/piorParado)*100 : 100;
    const piorCusto = max(x=>x.custoOfKm);
    const nCusto = piorCusto>0 ? (1 - l.custoOfKm/piorCusto)*100 : 100;
    return Object.assign({}, l, {nota: Math.round(nConsumo*0.5 + nParado*0.3 + nCusto*0.2)});
  }).sort((a,b)=>b.nota-a.nota);

  const melhor = notas[0];
  const kmTotal = comDado.reduce((s,l)=>s+l.km,0);
  const litrosTotal = comDado.reduce((s,l)=>s+l.litros,0);
  const kmlFrota = litrosTotal>0 ? kmTotal/litrosTotal : 0;
  const paradoTotal = linhas.reduce((s,l)=>s+l.diasParado,0);
  const custoOfTotal = linhas.reduce((s,l)=>s+l.custoOf,0);
  const melhorou = notas.filter(l=>l.tendencia!=null && l.tendencia>=2);
  const piorou   = notas.filter(l=>l.tendencia!=null && l.tendencia<=-2);

  const seta = (t) => t==null ? '' : t>=2 ? 'melhorou' : t<=-2 ? 'piorou' : 'estável';
  const pill = (t) => t==null ? 'p-carregando' : t>=2 ? 'p-base' : t<=-2 ? 'p-manutencao' : 'p-rota';

  return <div className="fp-bloco">
    <section className="panel mn-topo">
      <div className="fp-cab">
        <div><h2 className="fp-tit">Desempenho da frota</h2>
          <p className="fp-sub">Medido pelas viagens e pelos serviços lançados. Caminhão sem lançamento fica de fora.</p></div>
        <div className="fp-ctrl">
          <label className="seller-filter">Período
            <select value={dias} onChange={e=>setDias(parseInt(e.target.value,10))}>
              {[30,60,90].map(n=><option key={n} value={n}>últimos {n} dias</option>)}
            </select></label>
          <label className="seller-filter">Tanque (L)
            <select value={tanque} onChange={e=>setTanque(parseInt(e.target.value,10))}>
              {[300,400,500,600].map(n=><option key={n} value={n}>{n} L</option>)}
            </select></label>
        </div>
      </div>

      <div className="mg-kpis fp-kpis">
        <div><span>KM rodados</span><b>{fmt(Math.round(kmTotal))}</b>
          <small>{fmt(Math.round(kmTotal/dias))} por dia · {fmt(Math.round(kmTotal/dias*7))} por semana</small></div>
        <div><span>Média da frota</span><b>{kmlFrota>0?csFmt(kmlFrota)+' km/L':'—'}</b>
          <small>{comDado.length} de {(fleet||[]).length} caminhões com viagem lançada</small></div>
        <div><span>Oficina no período</span><b>{mnDias(paradoTotal)} dias</b>
          <small>{brl(Math.round(custoOfTotal))} em serviços</small></div>
        {melhor && <div className="hl"><span>Melhor da frota</span><b>{melhor.t.id}</b>
          <small>nota {melhor.nota} · {csFmt(melhor.kml)} km/L · {mnDias(melhor.diasParado)} dias parado</small></div>}
      </div>

      {(melhorou.length>0 || piorou.length>0) && <p className="fp-tend">
        {melhorou.length>0 && <>Melhoraram em relação aos {dias} dias anteriores: {melhorou.map(l=>`${l.t.id} (${csFmt(l.kmlAnt)} → ${csFmt(l.kml)})`).join(', ')}. </>}
        {piorou.length>0 && <>Pioraram: {piorou.map(l=>`${l.t.id} (${csFmt(l.kmlAnt)} → ${csFmt(l.kml)})`).join(', ')}.</>}
      </p>}
    </section>

    <section className="panel mn-tab">
      <div className="panel-title"><div><h2>Caminhão por caminhão</h2>
        <p>Ordenado pela nota. Quem não tem viagem lançada aparece no fim, sem nota.</p></div></div>
      <div className="table-wrap"><table>
        <thead><tr><th>Caminhão</th><th className="num">Nota</th><th className="num">KM/dia</th>
          <th className="num">KM/mês</th><th className="num">km/L</th><th>Tendência</th>
          <th className="num">Autonomia</th><th className="num">Oficina</th><th className="num">R$/km oficina</th></tr></thead>
        <tbody>
          {notas.map(l=><tr key={l.t.id} className={melhor&&l.t.id===melhor.t.id?'row-on':''}>
            <td><b className="strong">{l.t.id}</b><small className="cell-sub">{l.t.driver} · {l.viagens} {l.viagens===1?'viagem':'viagens'}</small></td>
            <td className="num strong">{l.nota}</td>
            <td className="num">{fmt(Math.round(l.kmDia))}</td>
            <td className="num">{fmt(Math.round(l.kmMes))}</td>
            <td className="num">{csFmt(l.kml)}</td>
            <td><span className={'pill '+pill(l.tendencia)}>{l.tendencia==null?'sem base':seta(l.tendencia)}</span>
              {l.tendencia!=null && Math.abs(l.tendencia)>=2 &&
                <small className="cell-sub">{l.tendencia>0?'+':''}{Math.round(l.tendencia)}% · antes {csFmt(l.kmlAnt)}</small>}</td>
            <td className="num">{fmt(Math.round(l.autonomia))} km</td>
            <td className="num">{mnDias(l.diasParado)} d</td>
            <td className="num">{l.custoOfKm>0?brl3(l.custoOfKm):'—'}</td>
          </tr>)}
          {linhas.filter(l=>!l.temDado).map(l=><tr key={l.t.id} className="fp-sem">
            <td><b className="strong">{l.t.id}</b><small className="cell-sub">{l.t.driver}</small></td>
            <td className="num">—</td><td className="num">—</td><td className="num">—</td><td className="num">—</td>
            <td><small className="cell-sub">sem viagem lançada no período</small></td>
            <td className="num">—</td><td className="num">{mnDias(l.diasParado)} d</td><td className="num">—</td>
          </tr>)}
        </tbody>
      </table></div>
      <p className="calc-note">
        <b>A nota</b> pesa consumo medido 50%, dias parado 30% e custo de oficina por km 20%, comparando os caminhões entre si no período.
        <b> A tendência</b> compara com os {dias} dias anteriores — é ela que mostra quem melhorou sozinho.
        <b> A autonomia</b> usa um tanque de {tanque} L, que é chute: o tamanho real do tanque é pergunta para o Paulo.
      </p>
    </section>
  </div>;
}
