$(document).ready(async function () {
  $('#modalObs').on('hide.bs.modal', function () {
    $('#txtObs').val('')
  })

  $('#modalCotacao').on('hide.bs.modal', function () {
    ModalCotacao.limparModal()
  })

  $('#btnObsCapa').on('click', async function () {
    const pesquisa = {
      tabela: 'COMPRA',
      camposSelect: ['OBS'],
      where: [`NUMERO = '${ModalCotacao.ordemCompra}'`],
    }

    const resultado = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisa))

    if (!resultado) {
      return
    }

    insereValor('#txtObs', resultado[0]?.OBS ?? '')
    $('#modalObs').modal('show')
  })

  $('#btnObsCotacao').on('click', async function () {
    const pesquisa = {
      tabela: 'COMPRA',
      camposSelect: ['OBS_COTACAO'],
      where: [`NUMERO = '${ModalCotacao.ordemCompra}'`],
    }

    const resultado = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisa))

    if (!resultado) {
      return
    }

    insereValor('#txtObs', resultado[0]?.OBS_COTACAO ?? '')
    $('#modalObs').modal('show')
  })

  $('#tabelaItensCotacao').on('click', '#btnInformacoesItem', async function () {
    const datatableItens = $('#tabelaItensCotacao').DataTable()
    const { codigo, cor, tam, tipoItem } = datatableItens?.row($(this)?.parents('tr'))?.data()
    ModalInformacoesItemCentralCompras.carregarModalInformacoesItem(codigo, cor, tam, tipoItem)
  })

  $('#tabelaItensCotacao').on('dblclick', 'tr', async function () {
    const { codigo, cor, tam, tipoItem } = $('#tabelaItensCotacao').DataTable().row($(this)).data()
    ModalInformacoesItemCentralCompras.carregarModalInformacoesItem(codigo, cor, tam, tipoItem)
  })
})

window.ModalCotacao = window.ModalCotacao || {}

ModalCotacao.fornecedorAprovado = null
ModalCotacao.ordemCompra = null

ModalCotacao.buscarDados = async function (numero, fornecedorAprovado) {
  try {
    $.LoadingOverlay('show')

    const response = await requisicao('GET', '/sisplan/centralcompras/compra/v1/cotacoes?', `NUMERO=${numero}&FORNECEDOR_APROVADO=${fornecedorAprovado}`, '', 90000)
    const dados = await response.json()

    if (!dados) {
      throw new Error('Não foi possível buscar os dados.')
    }

    const { mensagem } = dados
    if (mensagem?.codigo !== 200) {
      throw mensagem?.mensagem
    }

    const { resultado } = dados

    return resultado

  } catch (error) {
    console.error(error)
    msgErro(error)
  } finally {
    $.LoadingOverlay('hide')
  }
}

ModalCotacao.carregar = function ({ dadosCotacao, fornecedorAprovado, ordemCompra }) {
  try {
    ModalCotacao.fornecedorAprovado = fornecedorAprovado
    ModalCotacao.ordemCompra = ordemCompra
    ModalCotacao.criarTabelaCotacoes({ dados: dadosCotacao })
    if (!dadosCotacao || !dadosCotacao?.length) {
      ModalCotacao.criarTabelaItens({ dados: [] })
    }
    $('#modalCotacao').modal('show')
  } catch (error) {
    console.error(error)
    msgErro('Não foi possível carregar os dados.')
  }
}

ModalCotacao.criarTabelaCotacoes = function ({ dados }) {
  if ($.fn.DataTable.isDataTable('#tabelaCotacoesCotacao')) {
    $('#tabelaCotacoesCotacao').DataTable().destroy()
    $('#tabelaCotacoesCotacao').empty()
  }

  const columns = [
    {
      data: 'numero',
      title: 'Número',
    },
  ]

  const tabela = $('#tabelaCotacoesCotacao').DataTable({
    sort: false,
    paging: false,
    destroy: true,
    lengthChange: false,
    filter: false,
    info: false,
    ordering: false,
    sorting: false,
    order: false,
    autoWidth: true,
    data: dados ?? [],
    columns,
    scrollX: true,
    scrollY: '50vh',
    select: {
      style: 'single',
      toggleable: false,
    },
  })

  let selectedRowIndex = 0

  function selectRow(index) {
    const row = tabela.row(index)
    if (row.node()) {
      tabela.rows().deselect()
      tabela.row(index).select()
      selectedRowIndex = index
    }
  }

  tabela.off('select')
  tabela.on('select', function (_e, _dt, type, indexes) {
    if (type === 'row') {
      selectedRowIndex = indexes[0]
      const arrayData = tabela.rows(indexes[0]).data().toArray()
      const data = arrayData[0]
      if (!data) {
        return
      }
      ModalCotacao.carregarItens(data.numero)
    }
  })

  selectRow(selectedRowIndex)

  setTimeout(() => {
    tabela.columns.adjust()
  }, 300)
}

ModalCotacao.criarTabelaItens = function ({ dados }) {
  if ($.fn.DataTable.isDataTable('#tabelaItensCotacao')) {
    $('#tabelaItensCotacao').DataTable().destroy()
    $('#tabelaItensCotacao').empty()
  }

  const columns = [
    {
      data: 'ordem',
      title: 'Ordem',
      render: (data) => (
        '<div style="text-align:start;"> ' +
        '    <button class="btn btn-info btn-sm dropdown-toggle btnVerificaOpcoes" id="tutorialTabela" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> ' +
        '      ' + data + ' ' +
        '    </button> ' +
        '    <div class="dropdown-menu"> ' +
        '    <button class="dropdown-item" type="button" title="Informações Item" id="btnInformacoesItem">Informações Item</button>     ' +
        '</div>'
      )
    },
    {
      data: 'codigo',
      title: 'Código',
    },
    {
      data: 'descricao',
      title: 'Descrição',
    },
    {
      data: 'cor',
      title: 'Cor',
    },
    {
      data: 'descCor',
      title: 'Desc. Cor',
    },
    {
      data: 'tam',
      title: 'Tamanho',
    },
    {
      data: 'qtde',
      title: 'Quantidade',
      className: 'text-right',
      render: function (data) {
        return retornarFloatFormatadoEmMonetario({ valor: data, quantidadeCasasDecimais: 2 })
      }
    },
    {
      data: 'precoUltimaCompra',
      title: 'Preço Última Compra',
      className: 'text-right',
      render: function (data) {
        return retornarFloatFormatadoEmMonetario({ valor: data, quantidadeCasasDecimais: 2 })
      }
    },
    {
      data: 'fornecedorAprovado',
      title: 'Proposta Aprovada',
    },
    {
      data: 'precoAprovado',
      title: 'Preço Aprovado',
      className: 'text-right',
      render: function (data) {
        return retornarFloatFormatadoEmMonetario({ valor: data, quantidadeCasasDecimais: 2 })
      }
    },
    {
      data: 'tipoItem',
      title: 'Tipo Item',
      visible: false,
    }
  ]

  if (dados.length) {
    dados[0].cotacoes?.forEach((cotacao) => {
      const novaColuna = {
        data: cotacao.fornecedor,
        title: `${cotacao.numero} - ${cotacao.nome}`,
        className: 'text-right',
        render: function (data) {
          if (!data || !safeParseFloat(data)) {
            return '-'
          }
          return retornarFloatFormatadoEmMonetario({ valor: data, quantidadeCasasDecimais: 2 })
        }
      }
      columns.push(novaColuna)
    })

    dados.forEach((it) => {
      it.cotacoes.forEach((cotacao) => {
        const chave = cotacao.fornecedor
        it[chave] = cotacao.preco
      })
    })
  }

  const tabela = $('#tabelaItensCotacao').DataTable({
    sort: false,
    paging: false,
    destroy: true,
    lengthChange: false,
    filter: false,
    info: false,
    ordering: false,
    sorting: false,
    order: false,
    autoWidth: true,
    data: dados ?? [],
    columns,
    scrollX: true,
    scrollY: '50vh',
  })

  setTimeout(() => {
    tabela.columns.adjust()
  }, 300)
}

ModalCotacao.carregarItens = async function (numero) {
  try {
    $.LoadingOverlay('show')

    const response = await requisicao('GET', '/sisplan/centralcompras/compra/v1/itenscotacao?', `NUMERO=${numero}&FORNECEDOR_APROVADO=${ModalCotacao.fornecedorAprovado}&ORDEM_COMPRA=${ModalCotacao.ordemCompra}`, '', 90000)
    const dados = await response.json()

    if (!dados) {
      throw new Error('Não foi possível buscar os dados.')
    }

    const { mensagem } = dados
    if (mensagem?.codigo !== 200) {
      throw mensagem?.mensagem
    }

    const { resultado } = dados

    ModalCotacao.criarTabelaItens({ dados: resultado ?? [] })
  } catch (error) {
    console.error(error)
    msgErro('Não foi possível buscar os itens.')
  } finally {
    $.LoadingOverlay('hide')
  }
}

ModalCotacao.limparModal = () => {
  if ($.fn.DataTable.isDataTable('#tabelaCotacoesCotacao')) {
    $('#tabelaCotacoesCotacao').DataTable().destroy()
    $('#tabelaCotacoesCotacao').empty()
  }

  if ($.fn.DataTable.isDataTable('#tabelaItensCotacao')) {
    $('#tabelaItensCotacao').DataTable().destroy()
    $('#tabelaItensCotacao').empty()
  }
}