/* ===== Revezamento de oficina (14/11) ===============================
   Vem do ramo 5 do mapa de Frotas: "não deixar dois caminhões
   chegarem na revisão na mesma semana" e "mandar para a oficina no
   dia mais barato, não no dia em que quebrou".

   A REGRA, e ela é simples de propósito — ele tem que conseguir
   refazer de cabeça:
   1. Cada caminhão tem um próximo serviço, daqui a tantos dias.
      A semana natural dele é essa.
   2. Se a semana já está cheia, o caminhão é ANTECIPADO para a
      primeira semana livre antes dela.
   3. Nunca adiamos. Adiar passa da data e vira quebra; antecipar
      só perde um pouco de vida útil do serviço.
   4. Quem não encontra semana livre fica onde está e aparece como
      conflito que sobrou — o sistema não esconde o que não resolveu.

   `Quantos cabem por semana` é editável: com 7 caminhões, deixar 1
   na oficina mantém 6 rodando. É o padrão, mas em semana fraca pode
   valer dois.

   ⚠️ "Dia mais barato da semana" NÃO está aqui. Precisaria saber em
   que dia a operação dele é mais fraca, e isso ninguém perguntou.
   Está marcado como pergunta no mapa e no roteiro.
   ================================================================== */

const RV_SEMANAS = 8;

function rvPlanejar(fleet, servicos, porSemana){
  const alvo = Math.max(1, porSemana||1);
  const itens = (fleet||[]).map(t=>{
    const p = mnPrevisao(t, servicos);
    const i = p.proximo;
    const dias = i ? Math.max(0, Math.round(i.faltaDias)) : 999;
    return {t, s: i?i.s:null, dias, natural: Math.min(RV_SEMANAS-1, Math.floor(dias/7))};
  }).filter(x=>x.s).sort((a,b)=>a.dias-b.dias);

  const ocupacao = new Array(RV_SEMANAS).fill(0);
  itens.forEach(x=>{
    let w = x.natural;
    while(w >= 0 && ocupacao[w] >= alvo) w--;      /* só anda para trás: antecipa */
    if(w < 0){ x.semana = x.natural; x.sobrou = true; }
    else { x.semana = w; x.sobrou = false; }
    ocupacao[x.semana]++;
    x.anteciparDias = Math.max(0, x.dias - x.semana*7);
    x.mexeu = x.semana !== x.natural;
  });

  const semanas = [];
  for(let w=0; w<RV_SEMANAS; w++){
    const lista = itens.filter(x=>x.semana===w);
    semanas.push({w, lista,
      dias: lista.reduce((a,x)=>a+x.s.dias,0),
      custo: lista.reduce((a,x)=>a+x.s.custo,0),
      rodando: (fleet||[]).length - lista.length});
  }
  return {itens, semanas, conflitos: itens.filter(x=>x.sobrou).length, mexidos: itens.filter(x=>x.mexeu).length};
}

const rvData = (semana) => {
  const d = new Date(); d.setDate(d.getDate() + semana*7);
  const dd = (n)=>(n<10?'0':'')+n;
  return `${dd(d.getDate())}/${dd(d.getMonth()+1)}`;
};

function MnPlano({fleet, servicos}){
  const [porSemana,setPorSemana] = usePersist('mn-por-semana', 1);
  const total = (fleet||[]).length;
  const plano = rvPlanejar(fleet, servicos, porSemana);
  const minimo = total - Math.max(1, porSemana||1);

  if(!total) return null;

  return <section className="panel mn-tab">
    <div className="panel-title"><div><h2>Plano de oficina</h2>
      <p>Oito semanas, espalhando os serviços para não parar dois caminhões juntos.</p></div>
      <div className="heading-actions">
        <label className="seller-filter">Quantos cabem por semana
          <select value={porSemana} onChange={e=>setPorSemana(parseInt(e.target.value,10))}>
            {[1,2,3].map(n=><option key={n} value={n}>{n} caminhão{n>1?'ões':''}</option>)}
          </select></label>
      </div>
    </div>

    <p className="rv-resumo">
      {plano.mexidos>0 && <>Para não juntar serviço na mesma semana, <b>{plano.mexidos} {plano.mexidos===1?'caminhão foi antecipado':'caminhões foram antecipados'}</b>. Nenhum foi adiado: adiar passa da data e vira quebra. </>}
      {plano.conflitos>0
        ? <><b>{plano.conflitos} {plano.conflitos===1?'caminhão cai':'caminhões caem'} em semana já cheia e não há semana anterior livre</b> para antecipar — está marcado abaixo.
            Ou você aceita mais de um na mesma semana (muda o seletor acima), ou esse serviço vai esperar, o que não é recomendado.</>
        : plano.mexidos>0 ? null : <>Nenhum ajuste necessário: os serviços já caem espalhados.</>}
      {' '}Com esse plano, nunca ficam menos de <b>{minimo} de {total}</b> caminhões rodando.
    </p>

    <div className="rv-semanas">
      {plano.semanas.map(sm=><div key={sm.w} className={'rv-sem'+(sm.lista.length?'':' vazia')}>
        <div className="rv-cab">
          <b>{sm.w===0?'Esta semana':`Semana ${sm.w+1}`}</b>
          <em>a partir de {rvData(sm.w)}</em>
        </div>
        {sm.lista.length===0
          ? <p className="rv-livre">livre</p>
          : <>
            {sm.lista.map(x=><div key={x.t.id} className="rv-item">
              <div className="mm-top"><b>{x.t.id}</b>
                {x.sobrou
                  ? <span className="pill p-manutencao">conflito</span>
                  : x.mexeu
                    ? <span className="pill p-carregando">antecipado {x.anteciparDias} {x.anteciparDias===1?'dia':'dias'}</span>
                    : <span className="pill p-base">na data</span>}
              </div>
              <p className="mm-det">{x.s.nome} · {mnDias(x.s.dias)} {x.s.dias===1?'dia':'dias'} parado · {brl(x.s.custo)}</p>
            </div>)}
            <p className="rv-pe">{sm.rodando} de {total} rodando · {brl(sm.custo)}</p>
          </>}
      </div>)}
    </div>

    <p className="calc-note">
      A regra é só esta: quem cai em semana cheia é <b>antecipado</b> para a primeira semana livre antes dela. Nunca adiado.
      <b> O dia da semana ainda não entra na conta</b> — para mandar o caminhão no dia de menor carga seria preciso saber qual é esse dia,
      e isso é pergunta para o Paulo.
    </p>
  </section>;
}
