$(document).ready(async function () {
  // componenteFiltro('deposito', false, false, 'DepositoBaixaConsumosFaccao')
  // componenteFiltro('local', false, false, 'LocalBaixaConsumosFaccao')

  // $('#formBaixaConsumosFaccao').validate({
  //   rules: {
  //     deposito: {
  //       required: true,
  //     },
  //   },
  //   messages: {
  //     deposito: 'Depósito é obrigatório.',
  //   },
  //   errorElement: 'span',
  //   errorPlacement(error, element) {
  //     error.addClass('invalid-feedback')
  //     element.closest('.form-group').append(error)
  //   },
  //   highlight(element) {
  //     $(element).addClass('is-invalid')
  //   },
  //   unhighlight(element) {
  //     $(element).removeClass('is-invalid')
  //   },
  //   submitHandler: async (_form, event) => {
  //     event.preventDefault()
  //   }
  // })

  // const resetForm = (formSelector) => {
  //   $(formSelector)[0].reset()
  //   const validator = $(formSelector).validate()
  //   validator.resetForm()
  //   $(formSelector)
  //     .find('.error')
  //     .removeClass('error')
  // }

  // $('#modalBaixaConsumosFaccao').on('hide.bs.modal', () => {
  //   limparModal()
  //   resetForm('#formBaixaConsumosFaccao')
  // })

  // const limparModal = () => $('.formBaixaConsumosFaccao').val('')

  // $('#btnConfirmarBaixaConsumosFaccao').on('click', async () => {
  //   try {
  //     $.LoadingOverlay('show')
  //     const formValido = $('#formBaixaConsumosFaccao').valid()
  //     if (!formValido) {
  //       return
  //     }

  //     const dados = ModalAtualizaQuantidade.retornarDadosGravar()
  //     await ModalAtualizaQuantidade.gravar(dados)
  //   } catch (error) {
  //     console.error(error)
  //     msgErro('Não foi possível gravar os dados.')
  //   } finally {
  //     $.LoadingOverlay('hide')
  //   }
  // })

  // $('#txtDepositoBaixaConsumosFaccao').on('blur', async function () {
  //   try {
  //     const deposito = pegaChave(this)
  //     if (!deposito) {
  //       return
  //     }
  //     $.LoadingOverlay('show')

  //     const dados = await ModalAtualizaQuantidade.buscar(ModalAtualizaQuantidade.numero, ModalAtualizaQuantidade.parte, ModalAtualizaQuantidade.setor, deposito)
  //     ModalAtualizaQuantidade.carregar({ consumos: dados.consumos, estoque: dados.estoque })
  //   } finally {
  //     $.LoadingOverlay('hide')
  //   }
  // })

  $('#btnDesistirQtdeOF').on('click', function () {
    ModalAtualizaQuantidade.desistir(ModalAtualizaQuantidade.reject)
  })

  $('#modal-alterar-qtde-of').on('show.bs.modal', () => {
    ModalAtualizaQuantidade.buscar()
  })

  $('#btnConfirmarQtdeOF').on('click', () => {
    ModalAtualizaQuantidade.gravar()
  })
})

window.ModalAtualizaQuantidade = window.ModalAtualizaQuantidade || {}

ModalAtualizaQuantidade.numero = null
ModalAtualizaQuantidade.setor = null
ModalAtualizaQuantidade.parte = null
ModalAtualizaQuantidade.movimento = null
ModalAtualizaQuantidade.cliente = null
ModalAtualizaQuantidade.bPermiteQtdeFracionada = false
ModalAtualizaQuantidade.permiteQtdeMaior = false
ModalAtualizaQuantidade.resolve = () => { }
ModalAtualizaQuantidade.reject = () => { }

ModalAtualizaQuantidade.abrir = async function () {
  $('#modal-alterar-qtde-of').modal('show')
}

ModalAtualizaQuantidade.desistir = function (callback) {
  $('#modal-alterar-qtde-of').modal('hide')
  // if ($.fn.DataTable.isDataTable('#tabelaNovaQtdeOF')) {
  //   $('#tabelaNovaQtdeOF').DataTable().destroy();
  //   $('#tabelaNovaQtdeOF').empty();
  // };
  callback?.()
}

ModalAtualizaQuantidade.gravar = async function () {
  $.LoadingOverlay('show')
  try {
    const newDados = []
    const dadosOld = $("#tabelaItens").DataTable();
    dadosOld.rows().every(function () {
      const item = this.data();
      const row = $(this.node());
      const index = $(this.node()).index()
      const identificador = item.IDENTIFICADOR;
      const novaQuant = ModalAtualizaQuantidade.bPermiteQtdeFracionada ? isNaN(parseFloat($(`#txtQuantNova${index}`).val())) ? 0 : parseFloat($(`#txtQuantNova${index}`).val()) : isNaN(parseInt($(`#txtQuantNova${index}`).val())) ? 0 : parseInt($(`#txtQuantNova${index}`).val())

      newDados.push({
        // CODIGO: item.CODIGO,
        // COR: item.COR,
        // DESC_COR: item.DESC_COR,
        // TAM: item.TAM,
        // QUANT_ORIG: item.QUANT_ORIG,
        ...item,
        SALDO: novaQuant,
        QUANT: `<input type="number" min="0" class="input-default focus form-control campoQuant camposGrade text-right" id="QUANT${identificador}" value="${novaQuant}">`,
        QUANT_PERDIDA: `<input type="number" min="0" class="input-default focus form-control camposGrade qtdePerdidas text-right" id="QUANT_PERDIDA${identificador}" value="${row.find('.qtdePerdidas').val()}" style="min-width: 70px; max-width: 150px">`,
        QUANT_SEGUNDA: `<input type="number" min="0" class="input-default focus form-control camposGrade qtdeSegunda text-right" id="QUANT_SEGUNDA${identificador}" value="${row.find('.qtdeSegunda').val()}" style="min-width: 70px; max-width: 150px">`,
        QUANT_INCOMPLETA: `<input type="number" min="0" class="input-default focus form-control camposGrade qtdeIncompletas text-right" id="QUANT_INCOMPLETA${identificador}" value="${row.find('.qtdeIncompletas').val()}" style="min-width: 70px; max-width: 150px">`,
      })

    })
    // dadosOld.forEach((item, index) => {
    //   const identificador = item.IDENTIFICADOR;
    //   const novaQuant = ModalAtualizaQuantidade.bPermiteQtdeFracionada ? isNaN(parseFloat($(`#txtQuantNova${index}`).val())) ? 0 : parseFloat($(`#txtQuantNova${index}`).val()) : isNaN(parseInt($(`#txtQuantNova${index}`).val())) ? 0 : parseInt($(`#txtQuantNova${index}`).val())
    //   const objNovo = {
    //     ...item,
    //     // QUANT_ORIG: novaQuant,
    //     SALDO: novaQuant,
    //     QUANT: `<input type="number" min="0" class="input-default focus form-control campoQuant camposGrade text-right" id="QUANT${identificador}" value="${novaQuant}">`,
    //     ALTEROUQTDE: 'S'
    //   }

    //   newDados.push(objNovo)
    // })

    $('#tabelaItens').DataTable().clear().rows.add(newDados).draw(false)

    ModalAtualizaQuantidade.addBlurCamposGrade()

    $('.camposGrade').trigger('focusout');

    criaMensagemSucesso(`Dados gravados com sucesso!`, () => {
      ModalAtualizaQuantidade.desistir(ModalAtualizaQuantidade.resolve)
    });

    // $('#modal-alterar-qtde-of').modal('hide')
  } catch (error) {
    console.error(error)
    msgAlerta(error.message)
  } finally {
    $.LoadingOverlay('hide')
  }
}

ModalAtualizaQuantidade.buscar = async function () {
  $.LoadingOverlay('show')
  try {
    // if ((ModalAtualizaQuantidade.parte == '') || (ModalAtualizaQuantidade.setor == '')) {
    //   return false;
    // }

    // const params = `NUMERO=${ModalAtualizaQuantidade.numero}` +
    //   `&SETOR=${ModalAtualizaQuantidade.setor}` +
    //   `&PARTE=${ModalAtualizaQuantidade.parte}` +
    //   `&MOVIMENTO=${ModalAtualizaQuantidade.movimento}` +
    //   `&CODCLI=${ModalAtualizaQuantidade.cliente}` +
    //   `&NAO_ZERAR=N` +
    //   `&BPENDENTE=true` +
    //   `&BSETORANTERIOR=true`;

    // const response = await requisicao('GET', '/buscaitensmovfaccao?', params, undefined, 120000);

    // if (!response) {
    //   throw new Error('Erro na função de montar o modal de atualizar quantidades')
    // }

    // let jsonStr = await response.json();
    // if (!jsonStr.resultado) {
    //   throw new Error('Erro na função de montar o modal de atualizar quantidades')
    // }
    let jsonStr = []
    const table = $("#tabelaItens").DataTable();
    table.rows().every(function () {
      const item = this.data();
      const row = $(this.node());

      jsonStr.push({
        CODIGO: item.CODIGO,
        COR: item.COR,
        DESC_COR: item.DESC_COR,
        TAM: item.TAM,
        QUANT_ORIG: item.QUANT_ORIG,
        QUANT: row.find('.campoQuant').val()
      })

    })

    // const jsonStr = $('#tabelaItens').DataTable().data().toArray()
    if (ModalAtualizaQuantidade.buscaItensNovaQtde(jsonStr)) return true
  } catch (error) {
    console.error(error)
    return false
  } finally {
    $.LoadingOverlay('hide')
  }
}

ModalAtualizaQuantidade.buscaItensNovaQtde = function (data) {
  if ($.fn.DataTable.isDataTable('#tabelaNovaQtdeOF')) {
    $('#tabelaNovaQtdeOF').DataTable().destroy();
    $('#tabelaNovaQtdeOF').empty();
  };

  $.LoadingOverlay('show')
  try {

    // const jsonStr = data.resultado[0];

    const titulos = [
      { title: "Codigo", data: "CODIGO" },
      { title: "Cor", data: "COR" },
      { title: "Desc. Cor", data: "DESC_COR" },
      { title: "Tam", data: "TAM" },
      { title: "Quant_Orig.", data: "QUANT_ORIG" },
      { title: "Quant Nova", data: "QUANT" },
    ];

    // const codigo = jsonStr.codigo;
    let jsonObject;
    let bloqueiaModal = false
    let result = []

    // let i = 0;
    jsonObject = data.map(function (item, i) {
      // let tamanhosRenomeados = ModalAtualizaQuantidade.extrairRenomearTamanhos(gradeCor.tamanhos);
      // tamanhosRenomeados.forEach(function (tamanhoRenomeado, index) {
      let qtde = item.QUANT == 0 ? item.QUANT_ORIG : item.QUANT > item.QUANT_ORIG ? item.QUANT : item.QUANT
      return {
        CODIGO: item.CODIGO,
        COR: item.COR,
        DESC_COR: item.DESC_COR,
        TAM: item.TAM,
        QUANT_ORIG: item.QUANT_ORIG,
        QUANT: `<input type="number" min="0" class="input-default focus form-control campoQuant camposGrade text-right" id="txtQuantNova${i}" value="${qtde}">`,
      }
      // i++;
      // });
    }, []);

    // if (bloqueiaModal) return false

    $("#tabelaNovaQtdeOF").DataTable({
      destroy: true,
      filter: false,
      paging: false,
      autoWidth: false,
      columns: titulos,
      data: jsonObject,
      columnDefs: [
        {
          "targets": [0],
          visible: false
        },
        {
          "targets": [4, 5],
          "className": 'pr-4 text-right',
          width: '160px',
          minWidth: '160px'
        },
      ]
    });

    // $('#modal-alterar-qtde-of').modal('show')

    return true
  } catch (error) {
    console.error(error)
    msgAlerta(error.message)
    return false
  } finally {
    $.LoadingOverlay('hide')
  }
}

ModalAtualizaQuantidade.extrairRenomearTamanhos = function (tamanhos) {
  return tamanhos.map(function (tamanho) {
    return {
      TAM: tamanho.tam,
      QUANT: tamanho.quant,
      QUANT_INCOMPLETA: tamanho.quant_I,
      QUANT_ORIG: tamanho.quant_Orig,
      QUANT_SEGUNDA: tamanho.quant_2,
      QUANT_PERDIDA: tamanho.quant_F,
      SALDO: tamanho.saldo,
      IDENTIFICADOR: tamanho.identificador,
      QTDE_EXPURGA: tamanho.qtde_expurga,
    };
  })
}

ModalAtualizaQuantidade.carregar = function ({ numero, setor, parte, movimento, cliente, bPermiteQtdeFracionada, permiteQtdeMaior, resolve, reject }) {
  if (numero) {
    ModalAtualizaQuantidade.numero = numero
  }
  if (setor) {
    ModalAtualizaQuantidade.setor = setor
  }
  if (parte) {
    ModalAtualizaQuantidade.parte = parte
  }
  if (movimento) {
    ModalAtualizaQuantidade.movimento = movimento
  }
  if (cliente) {
    ModalAtualizaQuantidade.cliente = cliente
  }
  if (bPermiteQtdeFracionada) {
    ModalAtualizaQuantidade.bPermiteQtdeFracionada = bPermiteQtdeFracionada
  }
  if (permiteQtdeMaior) {
    ModalAtualizaQuantidade.permiteQtdeMaior = permiteQtdeMaior
  }
  if (resolve) {
    ModalAtualizaQuantidade.resolve = resolve
  }
  if (reject) {
    ModalAtualizaQuantidade.reject = reject
  }
}

ModalAtualizaQuantidade.addBlurCamposGrade = function () {
  $('#tabelaItens').on('draw.dt', function () {
    ModalAtualizaQuantidade.calcularTotais()
  })

  if (!ModalAtualizaQuantidade.bPermiteQtdeFracionada) {
    $('.camposGrade').on('focusout', async function () {
      let inputValue
      if ($(this).val() == '') {
        inputValue = 0
        $(this).val(0)
      } else {
        inputValue = $(this).val()
      }
      if (!Number.isInteger(parseFloat(inputValue))) {
        msgAlerta('Permitido apenas números inteiros!');
        $(this).val(0);
      }
      const inputId = $(this).attr('id');
      const numeroId = inputId.match(/\d+/)[0];
      const saldo = $("#tabelaItens").DataTable().data().toArray().filter(item => item.IDENTIFICADOR == numeroId)[0]?.SALDO ?? 0
      const quant = isNaN(parseInt($(`#QUANT${numeroId}`).val())) ? 0 : parseInt($(`#QUANT${numeroId}`).val());
      const segunda = isNaN(parseInt($(`#QUANT_SEGUNDA${numeroId}`).val())) ? 0 : parseInt($(`#QUANT_SEGUNDA${numeroId}`).val());
      const incompleta = isNaN(parseInt($(`#QUANT_INCOMPLETA${numeroId}`).val())) ? 0 : parseInt($(`#QUANT_INCOMPLETA${numeroId}`).val());
      const expurga = isNaN(parseInt($(`#QTDE_EXPURGA${numeroId}`).val())) ? 0 : parseInt($(`#QTDE_EXPURGA${numeroId}`).val());
      const perdida = isNaN(parseInt($(`#QUANT_PERDIDA${numeroId}`).val())) ? 0 : parseInt($(`#QUANT_PERDIDA${numeroId}`).val());
      const qtdeOrig = $('#tabelaItens').DataTable().row($(`#${$(this).attr('id')}`).closest('tr').index()).data().QUANT_ORIG
      const novoSaldo = (qtdeOrig - quant - segunda - incompleta - perdida - expurga).toFixed(0);
      let sair = false
      if (novoSaldo < 0 && ModalAtualizaQuantidade.permiteQtdeMaior) {
        if (!(ModalAtualizaQuantidade.permiteQtdeMaior)) {
          $(`#QUANT${numeroId}`).val(quant)
          $(`#QUANT_SEGUNDA${numeroId}`).val(segunda)
          $(`#QUANT_INCOMPLETA${numeroId}`).val(incompleta)
          $(`#QUANT_PERDIDA${numeroId}`).val(perdida)
          $(`#QTDE_EXPURGA${numeroId}`).val(expurga)
          $(`#SALDO${numeroId}`).val(qtdeOrig - quant - segunda - incompleta - perdida - expurga)
          // $(this).val(0)
          return msgAlerta('Saldo não pode ser negativo, verfique!')
        } else {
          if (inputId == `QUANT${numeroId}`) {
            // await msgAguardaConfirmacao(`Qtde de saldo é ${saldo} e a qtde digitada é ${quant}. Deseja Continuar?`, () => { }, () => {
            $(`#QUANT${numeroId}`).val(quant)
            $(`#QUANT_SEGUNDA${numeroId}`).val(segunda)
            $(`#QUANT_INCOMPLETA${numeroId}`).val(incompleta)
            $(`#QUANT_PERDIDA${numeroId}`).val(perdida)
            $(`#QTDE_EXPURGA${numeroId}`).val(expurga)
            $(`#SALDO${numeroId}`).val(qtdeOrig - quant - segunda - incompleta - perdida - expurga)
            // $(this).val(0)
            sair = true
            // })
            if (sair) {
              return
            }
          }
        }
      }
      $(`#SALDO${numeroId}`).val(novoSaldo);
    });
  } else {
    $('.camposGrade').on('focusout', async function () {
      const inputId = $(this).attr('id');
      const numeroId = inputId.match(/\d+/)[0];
      const saldo = $("#tabelaItens").DataTable().data().toArray().filter(item => item.IDENTIFICADOR == numeroId)[0]?.SALDO ?? 0
      const quant = isNaN(parseFloat($(`#QUANT${numeroId}`).val())) ? 0 : parseFloat($(`#QUANT${numeroId}`).val());
      const segunda = isNaN(parseFloat($(`#QUANT_SEGUNDA${numeroId}`).val())) ? 0 : parseFloat($(`#QUANT_SEGUNDA${numeroId}`).val());
      const incompleta = isNaN(parseFloat($(`#QUANT_INCOMPLETA${numeroId}`).val())) ? 0 : parseFloat($(`#QUANT_INCOMPLETA${numeroId}`).val());
      const expurga = isNaN(parseFloat($(`#QTDE_EXPURGA${numeroId}`).val())) ? 0 : parseFloat($(`#QTDE_EXPURGA${numeroId}`).val());
      const perdida = isNaN(parseFloat($(`#QUANT_PERDIDA${numeroId}`).val())) ? 0 : parseFloat($(`#QUANT_PERDIDA${numeroId}`).val());
      const novoSaldo = formatarValor((saldo - quant - segunda - incompleta - perdida).toFixed(2));
      const qtdeOrig = $('#tabelaItens').DataTable().row($(`#${$(this).attr('id')}`).closest('tr').index()).data().QUANT_ORIG
      let sair = false

      if (novoSaldo < 0) {
        if (!(ModalAtualizaQuantidade.permiteQtdeMaior)) {
          $(`#QUANT${numeroId}`).val(quant)
          $(`#QUANT_SEGUNDA${numeroId}`).val(segunda)
          $(`#QUANT_INCOMPLETA${numeroId}`).val(incompleta)
          $(`#QUANT_PERDIDA${numeroId}`).val(perdida)
          $(`#QTDE_EXPURGA${numeroId}`).val(expurga)
          $(`#SALDO${numeroId}`).val(qtdeOrig - quant - segunda - incompleta - perdida - expurga + parseFloat($(this).val()))
          $(this).val(0)
          return msgAlerta('Saldo não pode ser negativo, verfique!')
        } else {
          if (inputId == `QUANT${numeroId}`) {
            // await msgAguardaConfirmacao(`Qtde de saldo é ${saldo} e a qtde digitada é ${quant}. Deseja Continuar?`, () => { }, () => {
            $(`#QUANT${numeroId}`).val(quant)
            $(`#QUANT_SEGUNDA${numeroId}`).val(segunda)
            $(`#QUANT_INCOMPLETA${numeroId}`).val(incompleta)
            $(`#QUANT_PERDIDA${numeroId}`).val(perdida)
            $(`#QTDE_EXPURGA${numeroId}`).val(expurga)
            $(`#SALDO${numeroId}`).val(qtdeOrig - quant - segunda - incompleta - perdida - expurga + parseFloat($(this).val()))
            $(this).val(0)
            sair = true
            // })
            if (sair) {
              return
            }
          }
        }
      }

      $(`#SALDO${numeroId}`).val(novoSaldo);
    });
  }
}


ModalAtualizaQuantidade.calcularTotais = function () {
  let totalQuantOrig = 0
  let totalSaldo = 0
  let totalQuant = 0
  let totalSegunda = 0
  let totalIncompleta = 0
  let totalPerdida = 0
  let totalExpurga = 0

  $('#tabelaItens').DataTable().rows().every(function () {
    const row = $(this.node());
    const quantOrig = safeParseFloat(this.data()?.QUANT_ORIG) ?? 0
    const saldo = safeParseFloat(row.find('.campoSaldo').val()) ?? 0
    const quant = safeParseFloat(row.find('.campoQuant').val()) ?? 0
    const segunda = safeParseFloat(row.find('.qtdeSegunda').val()) ?? 0
    const incompleta = safeParseFloat(row.find('.qtdeIncompletas').val()) ?? 0
    const expurga = safeParseFloat(row.find('.qtdeExpurga').val()) ?? 0
    const perdida = safeParseFloat(row.find('.qtdePerdidas').val()) ?? 0

    totalQuantOrig += quantOrig
    totalSaldo += saldo
    totalQuant += quant
    totalSegunda += segunda
    totalIncompleta += incompleta
    totalPerdida += perdida
    totalExpurga += expurga
  })

  $('#txtTotalQuantOrig').val($('#tabelaResumo').DataTable().data()[$('#tabelaResumo').DataTable().data().length - 1].orig)
  $('#txtTotalSaldo').val(totalSaldo)
  $('#txtTotalQuant').val(totalQuant)
  $('#txtTotalSegunda').val(totalSegunda)
  $('#txtTotalIncompleta').val(totalIncompleta)
  $('#txtTotalPerdida').val(totalPerdida)
  $('#txtTotalExpurga').val(totalExpurga)
}