import json, re

# Carregar JSON completo de fornecedores
with open("D:/Evolução categorias/.worktrees/comissao/all_fornecedores.json", encoding="utf-8") as f:
    all_forn = json.load(f)

# Ler dashboard atual
with open("D:/Evolução categorias/.worktrees/comissao/dashboard_estoque.html", encoding="utf-8") as f:
    html = f.read()

# Serializar dados em JS compacto
forn_js = json.dumps(all_forn, ensure_ascii=False, separators=(',',':'))

# Substituir a lista RAW.top_forn_parado pelo array completo
# e também alimentar o select de fornecedores com todos
old_block = """  top_forn_parado: [
    {nome:"GRUPO CEDASA",vl_parado:16067,vl_total:61253,pct:26.2,parados:47,margem:39.7},
    {nome:"PISO FORMIGRES",vl_parado:15986,vl_total:57953,pct:27.6,parados:7,margem:45.6},
    {nome:"MADEREIRA CARAVAGGIO",vl_parado:14580,vl_total:39951,pct:36.5,parados:13,margem:44.7},
    {nome:"AMANCO - CONEXOES",vl_parado:13429,vl_total:55033,pct:24.4,parados:82,margem:44.5},
    {nome:"CERAMICA DELTA",vl_parado:13320,vl_total:23800,pct:56.0,parados:11,margem:40.4},
    {nome:"FANIA AQUECEDOR SOLAR",vl_parado:12493,vl_total:12493,pct:100.0,parados:3,margem:0},
    {nome:"A.J. RORATTO",vl_parado:11278,vl_total:32455,pct:34.7,parados:30,margem:39.4},
    {nome:"CHURRASQUEIRA COSTA",vl_parado:10822,vl_total:27373,pct:39.5,parados:19,margem:40.8},
    {nome:"MINAS VALE DISTRIB.",vl_parado:9892,vl_total:29026,pct:34.1,parados:209,margem:40.6},
    {nome:"GABINETES MGM",vl_parado:9479,vl_total:14881,pct:63.7,parados:19,margem:42.9},
    {nome:"JET MIX ESQUADRIAS",vl_parado:9437,vl_total:25515,pct:37.0,parados:11,margem:40.5},
    {nome:"MEGA LESTE DISTRIB.",vl_parado:8868,vl_total:36882,pct:24.0,parados:182,margem:46.5},
    {nome:"NOVAFORMA PLASTICOS",vl_parado:8549,vl_total:21048,pct:40.6,parados:15,margem:31.2},
    {nome:"KARINA PISOS",vl_parado:8168,vl_total:40283,pct:20.3,parados:3,margem:42.7},
    {nome:"LUSTRES IDEAL",vl_parado:7282,vl_total:8218,pct:88.6,parados:27,margem:41.8},
  ],"""

new_block = f"  top_forn_parado: {forn_js},"

html = html.replace(old_block, new_block)

# Atualizar slider topnParado para max=313
html = html.replace(
    'id="topnParado" min="3" max="15" value="10"',
    'id="topnParado" min="3" max="313" value="20"'
)
html = html.replace(
    '<strong id="topnParadoVal">10</strong>',
    '<strong id="topnParadoVal">20</strong>'
)

# Atualizar populateSelects() para usar RAW.top_forn_parado (que agora tem todos)
old_pop = """function populateSelects(){
  const grupos = [...new Set(RAW.top_grupos.map(r=>r.nome))].sort();
  const forn   = [...new Set(RAW.top_forn_parado.map(r=>r.nome))].sort();
  const sg = document.getElementById('fGrupo');
  const sf = document.getElementById('fFornecedor');
  grupos.forEach(g=>sg.add(new Option(g,g)));
  forn.forEach(f=>sf.add(new Option(f,f)));
}"""
new_pop = """function populateSelects(){
  const grupos = [...new Set(RAW.top_grupos.map(r=>r.nome))].sort();
  const forn   = [...new Set(RAW.top_forn_parado.map(r=>r.nome))].sort();
  const sg = document.getElementById('fGrupo');
  const sf = document.getElementById('fFornecedor');
  grupos.forEach(g=>sg.add(new Option(g,g)));
  forn.forEach(f=>sf.add(new Option(f.length>50?f.slice(0,48)+'\u2026':f, f)));
}"""
html = html.replace(old_pop, new_pop)

# Adicionar paginação na tabela de fornecedores
# 1) Substituir o card-title da aba para incluir controle de página
old_toolbar = """    <div class="table-toolbar">
      <input type="text" class="tbl-search" id="sForn" placeholder="Filtrar fornecedor…" oninput="renderForn()">
      <button class="sort-btn active" id="sortFornBtn" onclick="cycleSortForn()">Ordenar: Estoque Parado ↓</button>
      <div class="tbl-count" id="countForn">Exibindo <span>0</span> fornecedores</div>
    </div>"""
new_toolbar = """    <div class="table-toolbar">
      <input type="text" class="tbl-search" id="sForn" placeholder="Filtrar fornecedor…" oninput="fornPage=1;renderForn()">
      <button class="sort-btn active" id="sortFornBtn" onclick="cycleSortForn()">Ordenar: Estoque Parado ↓</button>
      <div style="display:flex;align-items:center;gap:6px;margin-left:auto;">
        <button class="sort-btn" id="btnFornPrev" onclick="fornPage=Math.max(1,fornPage-1);renderForn()">‹ Ant</button>
        <span id="fornPageInfo" style="font-family:var(--mono);font-size:11px;color:var(--dim);white-space:nowrap">1/1</span>
        <button class="sort-btn" id="btnFornNext" onclick="fornPage++;renderForn()">Próx ›</button>
        <select id="fornPageSize" class="filter-select" style="width:90px;padding:4px 8px;font-size:11px" onchange="fornPage=1;renderForn()">
          <option value="25">25 / pág</option>
          <option value="50">50 / pág</option>
          <option value="100">100 / pág</option>
          <option value="9999">Todos</option>
        </select>
        <div class="tbl-count" id="countForn">Total: <span>0</span></div>
      </div>
    </div>"""
html = html.replace(old_toolbar, new_toolbar)

# Adicionar variável de página antes da função renderForn
old_let = "let sortFornCycle = ['vl_parado','pct','parados','margem','vl_total'];"
new_let = "let fornPage = 1;\nlet sortFornCycle = ['vl_parado','pct','parados','margem','vl_total'];"
html = html.replace(old_let, new_let, 1)

# Substituir renderForn para suportar paginação
old_render_forn = """function renderForn(){
  const q=document.getElementById('sForn').value.toLowerCase();
  let data=filteredForn().filter(r=>!q||r.nome.toLowerCase().includes(q));
  data.sort((a,b)=>sortForn.asc?(a[sortForn.key]>b[sortForn.key]?1:-1):(a[sortForn.key]<b[sortForn.key]?1:-1));
  const tbody=document.getElementById('tbody-forn');
  document.querySelector('#countForn span').textContent=data.length;
  if(!data.length){tbody.innerHTML='<tr><td colspan="8" class="no-results">Nenhum fornecedor encontrado com os filtros aplicados.</td></tr>';return;}
  tbody.innerHTML=data.map((r,i)=>`
    <tr>
      <td class="td-mono">${i+1}</td>
      <td class="td-nome" title="${r.nome}">${r.nome}</td>
      <td class="td-mono">${r.parados}</td>
      <td class="td-mono" style="color:var(--danger)">${fmtR(r.vl_parado)}</td>
      <td class="td-mono">${fmtR(r.vl_total)}</td>
      <td>${progBar(r.pct)} <span class="td-mono">${r.pct.toFixed(1)}%</span></td>
      <td>${margemBadge(r.margem)} <span class="td-mono" style="margin-left:4px">${r.margem.toFixed(1)}%</span></td>
      <td>${riskBadge(r.pct)}</td>
    </tr>`).join('');
}"""

new_render_forn = """function renderForn(){
  const q=document.getElementById('sForn').value.toLowerCase();
  let data=filteredForn().filter(r=>!q||r.nome.toLowerCase().includes(q));
  data.sort((a,b)=>sortForn.asc?(a[sortForn.key]>b[sortForn.key]?1:-1):(a[sortForn.key]<b[sortForn.key]?1:-1));
  const total=data.length;
  document.querySelector('#countForn span').textContent=total;
  const pageSize=+document.getElementById('fornPageSize').value;
  const totalPages=Math.max(1,Math.ceil(total/pageSize));
  fornPage=Math.min(Math.max(1,fornPage),totalPages);
  document.getElementById('fornPageInfo').textContent=pageSize>=9999?'pág 1/1':`${fornPage}/${totalPages}`;
  document.getElementById('btnFornPrev').disabled=fornPage<=1;
  document.getElementById('btnFornNext').disabled=fornPage>=totalPages;
  const slice = pageSize>=9999 ? data : data.slice((fornPage-1)*pageSize, fornPage*pageSize);
  const offset = pageSize>=9999 ? 0 : (fornPage-1)*pageSize;
  const tbody=document.getElementById('tbody-forn');
  if(!slice.length){tbody.innerHTML='<tr><td colspan="8" class="no-results">Nenhum fornecedor encontrado com os filtros aplicados.</td></tr>';return;}
  tbody.innerHTML=slice.map((r,i)=>`
    <tr>
      <td class="td-mono">${offset+i+1}</td>
      <td class="td-nome" title="${r.nome}">${r.nome}</td>
      <td class="td-mono">${r.parados}</td>
      <td class="td-mono" style="color:var(--danger)">${fmtR(r.vl_parado)}</td>
      <td class="td-mono">${fmtR(r.vl_total)}</td>
      <td>${progBar(r.pct)} <span class="td-mono">${r.pct.toFixed(1)}%</span></td>
      <td>${margemBadge(r.margem)} <span class="td-mono" style="margin-left:4px">${r.margem.toFixed(1)}%</span></td>
      <td>${riskBadge(r.pct)}</td>
    </tr>`).join('');
}"""
html = html.replace(old_render_forn, new_render_forn)

# Corrigir filteredForn para usar campos corretos do novo JSON
old_filter = """function filteredForn(){
  const q=F.search;
  return RAW.top_forn_parado.filter(r=>{
    if(q && !r.nome.toLowerCase().includes(q)) return false;
    if(F.fornecedor && r.nome!==F.fornecedor) return false;
    if(r.pct < F.pctParado) return false;
    if(r.margem < F.margem) return false;
    if(r.vl_parado < F.vlrEst) return false;
    if(!F.risco.has('all') && !F.risco.has(riskLevel(r.pct))) return false;
    return true;
  });
}"""
new_filter = """function filteredForn(){
  const q=F.search;
  return RAW.top_forn_parado.filter(r=>{
    if(q && !r.nome.toLowerCase().includes(q)) return false;
    if(F.fornecedor && r.nome!==F.fornecedor) return false;
    if(r.pct < F.pctParado) return false;
    if(r.margem < F.margem) return false;
    if(r.vl_parado < F.vlrEst) return false;
    if(!F.risco.has('all') && !F.risco.has(riskLevel(r.pct))) return false;
    return true;
  });
}"""
html = html.replace(old_filter, new_filter)

# Corrigir updateKpis para usar todos os dados
old_kpis = """  const forn=filteredForn();
  const vlPar = forn.reduce((s,r)=>s+r.vl_parado,0);
  const vlTot = forn.reduce((s,r)=>s+r.vl_total,0);
  const nPar  = forn.reduce((s,r)=>s+r.parados,0);
  const margMedia = forn.length ? forn.reduce((s,r)=>s+r.margem,0)/forn.length : 0;

  // receita e lucro from receita table filtered
  const rec = RAW.top_forn_receita.filter(r=>
    (!F.search||r.nome.toLowerCase().includes(F.search)) &&
    (!F.fornecedor||r.nome===F.fornecedor)
  );
  const vlRec = rec.reduce((s,r)=>s+r.receita,0);
  const vlLuc = rec.reduce((s,r)=>s+r.lucro,0);

  setKpi('prods', forn.length || '–', `de 15 fornecedores no top`);"""
new_kpis = """  const forn=filteredForn();
  const vlPar = forn.reduce((s,r)=>s+r.vl_parado,0);
  const vlTot = forn.reduce((s,r)=>s+r.vl_total,0);
  const nPar  = forn.reduce((s,r)=>s+r.parados,0);
  const margMedia = forn.filter(r=>r.receita>0).length
    ? forn.filter(r=>r.receita>0).reduce((s,r)=>s+r.margem,0)/forn.filter(r=>r.receita>0).length : 0;
  const vlRec = forn.reduce((s,r)=>s+r.receita,0);
  const vlLuc = forn.reduce((s,r)=>s+r.lucro,0);

  setKpi('prods', forn.length || '–', `de ${RAW.top_forn_parado.length} fornecedores`);"""
html = html.replace(old_kpis, new_kpis)

# Salvar
with open("D:/Evolução categorias/.worktrees/comissao/dashboard_estoque.html","w",encoding="utf-8") as f:
    f.write(html)

print("Dashboard atualizado com 313 fornecedores.")
