$(document).ready(function () {
  try {
    FLUIGC.calendar('#dataNec');
  } catch (e) {
    console.warn("Erro ao iniciar calendário:", e);
  }

  toggleBotaoAddItem(); // inicia escondido

  /* ========= Eventos ========= */
  $('#precoRef, #quantidade').on('input', recalcTotal);

  $('#qtdMais').on('click', function () {
    let v = parseInt($('#quantidade').val() || '0', 10);
    $('#quantidade').val(v + 1);
    recalcTotal();
  });

  $('#qtdMenos').on('click', function () {
    let v = parseInt($('#quantidade').val() || '0', 10);
    v = Math.max(0, v - 1);
    $('#quantidade').val(v);
    recalcTotal();
  });

  $('#btnBuscaProd').on('click', consultarProdutos);
  $('#btnLimpaProd').on('click', limparCamposPrincipais);
  $('#btnAddItem').on('click', adicionarItem);
});

$(document).ready(function () {
  if ($("#formMode").val() == "VIEW") {
    showAndBlock(["all"]);
  } else {
    //show the right fields
    var activity = $("#activity").val();
    var requestDate = getCurrentDate();

    $(".activity").hide();

    $(".activity-" + activity).show();

    if (activity == 0 || activity == 1) {
      //primeira atividade
      //$("#dataAbertura").val(requestDate[0] + " - " + requestDate[1]);
      $("#dataAbertura").val(requestDate[0]);

    } else if (activity == 4) {
      showAndBlock([0]);
      $("#userValidacaoGestor").val($("#currentUserName").val());
      $("#dataValidacaoGestor").val(
        requestDate[0] + " - " + requestDate[1]
      );
      updt_line();
    
    } else if (activity == 6) {
      showAndBlock([0, 4]);
      $("#userValidacaoCompras").val($("#currentUserName").val());
      $("#dataValidacaoCompras").val(
        requestDate[0] + " - " + requestDate[1]
      );

      if ($("#justificativaDecisaoGestor").val() == "") {
        $(".justificativa-activity-4").hide();
      }
      updt_line();

    } else if (activity == 57) {
      $("#userCotacaoGestor").val($("#currentUserName").val());
      $("#dataAprovCompras").val(
        requestDate[0] + " - " + requestDate[1]
      );
      showAndBlock([0, 4, 6]);

      if ($("#justificativaDecisaoGestor").val() == "") {
        $(".justificativa-activity-4").hide();
      }
      if ($("#justificativaDecisaoCompras").val() == "") {
        $(".justificativa-activity-6").hide();
      }
      updt_line();

    } else if (activity == 31) {
      $("#userRealizacaoCompras").val($("#currentUserName").val());
      $("#dataRealizacaoCompras").val(
        requestDate[0] + " - " + requestDate[1]
      );
      showAndBlock([0, 4, 6, 57]);

      if ($("#justificativaDecisaoGestor").val() == "") {
        $(".justificativa-activity-4").hide();
      }
      if ($("#justificativaDecisaoCompras").val() == "") {
        $(".justificativa-activity-6").hide();
      }
      updt_line();
    } else if (activity == 18) {
      if ($("justificativaValidaProblema") != "") {
        showAndBlock([0, 4, 6, 24, 57, 31]);
      } else {
        showAndBlock([0, 4, 6, 31]);
      }
      $("#userValidacaoItens").val($("#currentUserName").val());
      $("#dataValidacaoItens").val(requestDate[0] + " - " + requestDate[1]);

      if ($("#justificativaDecisaoGestor").val() == "") {
        $(".justificativa-activity-4").hide();
      }
      if ($("#justificativaDecisaoCompras").val() == "") {
        $(".justificativa-activity-6").hide();
      }
      if ($("#consideracoesCompras").val() == "") {
        $(".justificativa-activity-31").hide();
      }

      $("input[name=validacaoItens]").on("change", function () {
        $(".justificativaDecisaoItens").hide();
        if (
          $("input[name=validacaoItens]:checked").val() == "incorreto" ||
          $("input[name=validacaoItens]:checked").val() == "naoEntregue"
        ) {
          $(".justificativaDecisaoItens").show();
        }
      });
      $("input[name=validacaoItens]").trigger("change");

      updt_line();
    } else if (activity == 24) {
      showAndBlock([0, 4, 6, 31, 18]);

      if ($("#justificativaDecisaoGestor").val() == "") {
        $(".justificativa-activity-4").hide();
      }
      if ($("#justificativaDecisaoCompras").val() == "") {
        $(".justificativa-activity-6").hide();
      }
      if ($("#consideracoesCompras").val() == "") {
        $(".justificativa-activity-31").hide();
      }
      updt_line();
    }
  }

});

function getCurrentDate() {
    var newDate = new Date();
    var h = newDate.getHours();
    if (h < 10) {
        h = "0" + h;
    }
    var m = newDate.getMinutes();
    if (m < 10) {
        m = "0" + m;
    }
    var hour = h + ":" + m; // + ":" + s;
    var day = newDate.getDate();
    if (day < 10) {
        day = "0" + day;
    }
    var month = newDate.getMonth() + 1;
    if (month < 10) {
        month = "0" + month;
    }
    newDate = day + "/" + month + "/" + newDate.getFullYear();
    var currentDate = [newDate, hour];
    return currentDate;
}


function toggleBotaoAddItem() {
  const temProduto = $('#produtoCod').val() || $('#DescoProduto').val();
  if (temProduto && temProduto.trim() !== "") {
    $('#btnAddItem').show();
  } else {
    $('#btnAddItem').hide();
  }
}

function setSelectedZoomItem(selectedItem) {
  if (selectedItem.inputId === "estabelecimento") {
    // joga o código da filial (cnpj, etc.)
    $("#filialDesc").val(selectedItem.CNPJ);   // supondo que o dataset dsSysCompany devolva o campo CNPJ
    $("#filialest").val(selectedItem.ESTADO);  // supondo que o dataset dsSysCompany devolva o campo ESTADO
  }
  if (selectedItem.inputId === "centroCusto") {
    // joga o nome do gestor
    $("#gestorCentroCusto").val(selectedItem.gestorCentroCusto);   // supondo que o dataset dsCentroCusto devolva o campo GestorCentroCusto
  }
}

function removedZoomItem(removedItem) {
  if (removedItem.inputId === "estabelecimento") {
    // Quando remover a empresa, limpa os campos relacionados
    $("#filialDesc").val('');
    $("#filialest").val('');
  }
}


/* ========= Config ========= */
const DATASET_PRODUTOS = "dsProd"; // dataset de produtos
let todosProdutos = [];
let paginaAtual = 1;
const itensPorPagina = 10;

/* ========= Utils ========= */
function escapeHTML(txt) {
  return $('<div>').text(txt == null ? '' : String(txt)).html();
}

function brMoneyToFloat(v) {
  if (!v) return 0;
  return parseFloat(String(v).replace(/\./g, '').replace(',', '.')) || 0;
}

function floatToBRL(n) {
  try {
    return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(n || 0);
  } catch (_) {
    return 'R$ ' + (n || 0).toFixed(2).replace('.', ',');
  }
}

/* ========= Modal Consulta Produtos ========= */
function consultarProdutos() {
  FLUIGC.modal({
    title: 'Consulta de Produtos',
    content:
      '<div id="buscaProduto" style="margin-bottom:10px;">' +
      '<input type="text" id="filtroDescricao" class="form-control" placeholder="Buscar por descrição..." onkeyup="filtrarProdutos()">' +
      '</div>' +
      '<div id="listaProdutos"></div>' +
      '<div id="paginacaoProdutos" style="margin-top:10px; text-align:center;"></div>',
    id: 'modalConsultaProdutos',
    size: 'large',
    actions: [{ 'label': 'Fechar', 'autoClose': true }]
  }, function (err) {
    if (!err) carregaListaProdutos();
  });
}

function carregaListaProdutos(filtro) {
  // Só chama o dataset se ainda não carregou nada
  if (todosProdutos.length === 0) {
    let dataset = DatasetFactory.getDataset(DATASET_PRODUTOS, null, null, null);
    todosProdutos = dataset && dataset.values ? dataset.values : [];
    console.log("Produtos carregados do dataset:", todosProdutos.length);
  }

  paginaAtual = 1;
  renderizaProdutos(filtro);
}


function filtrarProdutos() {
  paginaAtual = 1;
  renderizaProdutos();
}

function renderizaProdutos(filtro) {
  filtro = (filtro || $('#filtroDescricao').val() || '').toLowerCase();

  // Agora filtra no cache (sem chamar dataset de novo)
  const produtosFiltrados = todosProdutos.filter(p =>
    (p.descricao || '').toLowerCase().includes(filtro) ||
    (p.codigo || '').toLowerCase().includes(filtro) ||
    (p.medida || '').toLowerCase().includes(filtro)
  );

  const inicio = (paginaAtual - 1) * itensPorPagina;
  const fim = inicio + itensPorPagina;
  const produtosPagina = produtosFiltrados.slice(inicio, fim);

  let html = `
    <table class="table table-striped">
      <thead>
        <tr>
          <th>Codigo</th>
          <th>Descricao</th>
          <th>UM</th>
          <th>Ultimo Preco</th>
          <th>Acao</th>
        </tr>
      </thead>
      <tbody>
  `;

  if (produtosPagina.length === 0) {
    html += `
      <tr>
        <td colspan="5" class="text-center text-muted">
          Nenhum produto encontrado
        </td>
      </tr>`;
  } else {
    produtosPagina.forEach(produto => {
      const codigo = escapeHTML(produto['codigo']);
      const descricao = escapeHTML(produto['descricao']);
      const um = escapeHTML(produto['medida'] || '');
      const preco = produto['ultimoPreco'] || '0,00';

      html += `
        <tr>
          <td>${codigo}</td>
          <td>${descricao}</td>
          <td>${um}</td>
          <td>${preco}</td>
          <td>
            <button class="btn btn-sm btn-success selecionar-produto"
                    data-codigo="${codigo}"
                    data-descricao="${descricao}"
                    data-preco="${preco}">
              Selecionar
            </button>
          </td>
        </tr>`;
    });
  }

  html += `</tbody></table>`;
  $('#listaProdutos').html(html);

  renderizaPaginacao(produtosFiltrados.length);
}



function renderizaPaginacao(totalItens) {
  const totalPaginas = Math.ceil(totalItens / itensPorPagina);
  let html = '';
  if (totalPaginas > 1) {
    if (paginaAtual > 1) {
      html += '<button class="btn btn-sm btn-default" onclick="mudarPagina(' + (paginaAtual - 1) + ')">Anterior</button> ';
    }
    html += ' Pagina ' + paginaAtual + ' de ' + totalPaginas + ' ';
    if (paginaAtual < totalPaginas) {
      html += '<button class="btn btn-sm btn-default" onclick="mudarPagina(' + (paginaAtual + 1) + ')">Proxima</button>';
    }
  }
  $('#paginacaoProdutos').html(html);
}

function mudarPagina(n) {
  paginaAtual = n;
  renderizaProdutos();
}

/* ========= Seleção ========= */
function selecionarProduto(codigo, descricao, preco) {
  $('#produtoCod').val(codigo);
  $('#DescoProduto').val(codigo + ' - ' + descricao);
  $('#ultimoPreco').val(preco);

  FLUIGC.toast({ title: 'Produto', message: 'Selecionado: ' + descricao, type: 'success' });
  $('#modalConsultaProdutos').modal('hide');

  toggleBotaoAddItem(); // 👈 mostra botão
}

/* ========= Eventos delegados ========= */
$(document).on('click', '.selecionar-produto', function () {
  const codigo = $(this).data('codigo');
  const descricao = $(this).data('descricao');
  const preco = $(this).data('preco');
  selecionarProduto(codigo, descricao, preco);
});

// Digitação em Qtd ou Preço Ref → recalcula automaticamente
$(document).on('input', 'input[name^="qtd___"], input[name^="Refpreco___"]', function () {
  recalcLinha(this);
});

/* ========= Total / Quantidade ========= */
function recalcTotal() {
  const q = parseFloat($('#quantidade').val() || '0');
  const p = brMoneyToFloat($('#precoRef').val());
  const t = (q * p) || 0;
  $('#total').val(floatToBRL(t));
}

/* ========= Index das linhas ========= */
function atualizarIndex() {
  $('#tbItens tbody tr.tableRow').each(function (i) {
    if (!$(this).is('[detail=true]')) {
      $(this).find('.tableIndex').text(i);
    }
  });
}

/* ========= Totais da tabela ========= */
function atualizarTotais() {
  let totalItens = 0;
  let totalGeral = 0;

  // Pega todos os valores da tabela
  const dadosTabela = $('#tbItens').find('input').serializeArray();

  // Transforma em objeto chave:valor para fácil acesso
  const mapValores = {};
  dadosTabela.forEach(item => {
    mapValores[item.name] = item.value;
  });

  // Percorre por linha (cada linha tem um sufixo ___1, ___2...)
  let idx = 1;
  while (mapValores['qtd___' + idx] !== undefined) {
    const qtd = parseFloat(mapValores['qtd___' + idx] || 0);
    const preco = brMoneyToFloat(mapValores['Refpreco___' + idx] || "0");
    const total = qtd * preco;

    totalItens += qtd;
    totalGeral += total;

    // Atualiza campo total da linha
    if ($(`#totalValor___${idx}`).length) {
      $(`#totalValor___${idx}`).val(floatToBRL(total));
    }

    idx++;
  }

  // Atualiza rodapé
  $('#totalItens').val(totalItens);
  $('#totalGeral').val(floatToBRL(totalGeral));
}

/* ========= Recalcula uma linha ========= */
function recalcLinha(el) {
  const $linha = $(el).closest('tr');
  const qtd = parseFloat($linha.find('input[name^="qtd___"]').val() || '0');
  const preco = brMoneyToFloat($linha.find('input[name^="Refpreco___"]').val() || '0');
  const total = qtd * preco;

  $linha.find('input[name^="totalValor___"]').val(floatToBRL(total));
  atualizarTotais();
}

/* ========= Remover linha ========= */
function fnWdkRemoveChild(el) {
  $(el).closest('tr').remove();
  atualizarIndex();
  atualizarTotais();
}

/* ========= Adicionar Item ========= */
function adicionarItem() {
  const cod = $('#produtoCod').val();
  const desc = $('#DescoProduto').val();
  const ult = $('#ultimoPreco').val() || '0,00';
  const qtd = $('#quantidade').val();
  const prec = $('#precoRef').val();
  const tot = $('#total').val();
  const dataN = $('#dataNec').val();

  if (!cod) {
    FLUIGC.toast({ title: 'Atenção', message: 'Selecione um produto/serviço', type: 'warning' });
    return;
  }

  const idx = wdkAddChild('tbItens');

  setTimeout(() => {
    $('input[name="Codproduto___' + idx + '"]').val(cod);

    const somenteDesc = desc.includes('-') ? desc.split('-').slice(1).join('-').trim() : desc;
    $('input[name="produtoDesc___' + idx + '"]').val(somenteDesc);

    $('input[name="ultimoPrecoItem___' + idx + '"]').val(ult);
    $('input[name="qtd___' + idx + '"]').val(qtd).on('input', function () { recalcLinha(this); });
    $('input[name="Refpreco___' + idx + '"]').val(prec).on('input', function () { recalcLinha(this); });
    $('input[name="totalValor___' + idx + '"]').val(tot);
    $('input[name="dataNecItem___' + idx + '"]').val(dataN);

    atualizarIndex();
    atualizarTotais();
  }, 0);

  FLUIGC.toast({ title: 'Item', message: 'Adicionado à lista', type: 'success' });

  limparCamposPrincipais();
}

/* ========= Limpar campos principais ========= */
function limparCamposPrincipais() {
  $('#produtoCod, #DescoProduto').val('');
  $('#ultimoPreco').val('0,00');
  $('#quantidade').val('0');
  $('#precoRef').val('0,00');
  $('#total').val('R$ 0,00');
  $('#fnComprovante').val('');


  toggleBotaoAddItem(); // 👈 mostra botão
}
