$('#tutorial').on('click', function () {
    $(document).ready(async function () {
        const driver = new Driver({
            doneBtnText: 'Sair',
            closeBtnText: 'Fechar',
            nextBtnText: 'Próximo',
            prevBtnText: 'Anterior',
            allowClose: false
        })
        driver.defineSteps([
            {
                element: "#camposTutorial",
                popover: {
                    title: "Campos",
                    description:
                        "Aqui se encontram os campos essenciais para consultar e gravar as informações.",
                    position: "bottom",
                },
            },
            {
                element: '#tabelaTutorial',
                popover: {
                    title: 'Itens',
                    description: 'Aqui se encontram os itens adicionados.',
                    position: 'bottom'
                }
            },
            {
                element: '#btnLimpar',
                popover: {
                    title: 'Limpar',
                    description: 'Aqui se encontra o botão para limpar os campos e itens.',
                    position: 'bottom'
                }
            },
            {
                element: '#btnGravar',
                popover: {
                    title: 'Gravar',
                    description: 'Aqui se encontra o botão para gravar as informações.',
                    position: 'bottom'
                }
            }
        ])
        driver.start()
    })
})

$(document).ready(async function () {
    componenteFiltro('tipoMov', false, false, 'TipoMov')
    componenteFiltro('deposito', false, false, 'DepositoOrigem')
    componenteFiltro('deposito', false, false, 'DepositoDestino')
    componenteFiltro('defeito', false, false)

    carregarValoresPadroes()
    criarTabelaItens([])
    buscarDocumento()

    async function buscarDocumento() {
        const documento = await RetornaProximo("DOCTO", "PA_MOV", "NUM_DOCTO", "6")
        if (!documento) {
            msgErro('Não foi possível buscar o próximo documento.')
            return
        }
        $('#txtDocumento').val(documento)
    }

    $('#txtBarra').on('keypress', function (e) {
        if (e.which === 13) {
            e.preventDefault()
            $(this).blur()
        }
    });

    $('#txtBarra').on('blur', function () {
        if (!this.value) {
            return
        }
        if ($('#btnMenos').hasClass('d-none')) {
            const dados = retornarDadosLerBarra(this.value)
            if (!validarDadosLerBarra(dados)) {
                $(this).val('')
                return
            }
            lerBarra(dados)
            return
        }

        const dados = retornarDadosEstornarBarra(this.value)
        if (!validarDadosEstornarBarra(dados)) {
            $(this).val('')
            return
        }
        estornarBarra(dados)
    })

    $('#btnMais').on('click', function () {
        $(this).addClass('d-none')
        $('#btnMenos').removeClass('d-none')
    })

    $('#btnMenos').on('click', function () {
        $(this).addClass('d-none')
        $('#btnMais').removeClass('d-none')
    })

    function retornarDadosLerBarra(barra) {
        const deposito = pegaChave('#txtDepositoOrigem')
        const qualidade = TransfQualidade.qualidadeOrigem
        const defeito = pegaChave('#txtDefeito')

        let barraRetorno = ''

        if (barra.startsWith('TQ')) {
            barraRetorno = barra.substring(2);
        } else {
            barraRetorno = barra
        }

        return {
            barra: barraRetorno,
            deposito,
            qualidade,
            defeito,
        }
    }

    function validarDadosLerBarra(dados) {
        if (!dados.barra) {
            return false
        }

        if (!dados.deposito) {
            msgErro('Depósito de origem não informado, impossível continuar.')
            return false
        }

        if (!dados.qualidade) {
            msgErro('Qualidade de origem não configurada nos Valores Padrões > Transf. Depósito, impossível continuar.')
            return false
        }

        if (!dados.defeito) {
            msgErro('Defeito não informado, impossível continuar.')
            return false
        }

        if (TransfQualidade.itensBarra.some((it) => it.barra === dados.barra)) {
            msgErro('Barra já bipada, impossível continuar.')
            return false
        }

        return true
    }

    async function lerBarra(dados) {
        try {
            $.LoadingOverlay('show')
            const response = await requisicao('GET', `/sisplan/transfqualidade/v1/barra?`, `BARRA=${encodeURIComponent(dados.barra)}&DEPOSITO=${dados.deposito}&QUALIDADE=${dados.qualidade}`, '', 3600000)

            const json = await response.json()

            if (!json) {
                return
            }

            const { resultado, mensagem } = json
            if (mensagem?.codigo !== 200) {
                msgErro(mensagem?.mensagem)
                return
            }

            if (!resultado) {
                msgErro('Não foi possível localizar o item.')
                return
            }

            const defeito = retornarChaveDescricao('#txtDefeito')
            adicionarItemEstoque(resultado)
            adicionarItemFaccao(resultado)
            adicionarItemDefeito(resultado, defeito)
            adicionarItemTabela(resultado, defeito)
            const itemBarra = { ...resultado, defeito: defeito.chave, descDefeito: defeito.descricao }
            TransfQualidade.itensBarra.push(itemBarra)
        }
        catch (error) {
            console.error(error)
            msgErro(
                'Não foi possível ler a barra.',
                () => {
                    $('#txtBarra').val('')
                    $('#txtBarra').focus()
                },
                () => {
                    $('#txtBarra').val('')
                    $('#txtBarra').focus()
                },
            )
        } finally {
            $.LoadingOverlay('hide')
            $('#txtBarra').val('')
            $('#txtBarra').focus()
        }
    }

    function retornarDadosEstornarBarra(barra) {
        const item = TransfQualidade.itensBarra.find((it) => it.barra === barra)
        let indexEstoque = -1
        let indexFaccao = -1
        let indexDefeito = -1
        let indexTabela = -1
        let itensTabela = []
        if (item) {
            indexEstoque = TransfQualidade.itensEstoque.findIndex((it) => it.codigo === item.codigo && it.cor === item.cor && it.tam === item.tam && it.depositoOrigem === item.depositoOrigem)
            indexFaccao = TransfQualidade.itensFaccao.findIndex((it) => it.numero === item.numero && it.codigo === item.codigo && it.cor === item.cor && it.tam === item.tam && it.parte === item.parte && it.setor === item.setor && it.mov === item.mov && it.movFac === item.movFac)
            indexDefeito = TransfQualidade.itensDefeito.findIndex((it) => it.numero === item.numero && it.codigo === item.codigo && it.cor === item.cor && it.tam === item.tam && it.parte === item.parte && it.setor === item.setor && it.mov === item.mov && it.defeito === item.defeito)
            itensTabela = $('#tabelaItens').DataTable().data().toArray()
            indexTabela = itensTabela.findIndex((it) => it.numero === item.numero && it.codigo === item.codigo && it.cor === item.cor && it.tam === item.tam && it.depositoOrigem === item.depositoOrigem && it.defeito === item.defeito)
        }

        return {
            item,
            indexEstoque,
            indexFaccao,
            indexDefeito,
            itensTabela,
            indexTabela,
        }
    }

    function validarDadosEstornarBarra(dados) {
        if (!dados.item) {
            msgErro('Barra não foi bipada, impossível continuar.')
            return false
        }

        if (dados.indexEstoque < 0 || dados.indexFaccao < 0 || dados.indexDefeito < 0 || dados.indexTabela < 0) {
            msgErro('Item não encontrado, impossível continuar.')
            return false
        }

        return true
    }

    function estornarBarra(dados) {
        try {
            estornarItemEstoque(dados.indexEstoque)
            estornarItemFaccao(dados.indexFaccao)
            estornarItemDefeito(dados.indexDefeito)
            estornarItemTabela(dados.indexTabela, dados.itensTabela)
            estornarItemBarra(dados.item)
        } catch (error) {
            console.error(error)
            msgErro(
                'Não foi possível estornar a barra.',
                () => {
                    $('#txtBarra').val('')
                    $('#txtBarra').focus()
                },
                () => {
                    $('#txtBarra').val('')
                    $('#txtBarra').focus()
                },
            )
        } finally {
            $('#txtBarra').val('')
            $('#txtBarra').focus()
        }
    }

    function estornarItemEstoque(index) {
        if (TransfQualidade.itensEstoque[index].qtde === 1) {
            TransfQualidade.itensEstoque.splice(index, 1)
        } else {
            TransfQualidade.itensEstoque[index].qtde -= 1
        }
    }

    function estornarItemFaccao(index) {
        if (TransfQualidade.itensFaccao[index].qtde === 1) {
            TransfQualidade.itensFaccao.splice(index, 1)
        } else {
            TransfQualidade.itensFaccao[index].qtde -= 1
        }
    }

    function estornarItemDefeito(index) {
        if (TransfQualidade.itensDefeito[index].qtde === 1) {
            TransfQualidade.itensDefeito.splice(index, 1)
        } else {
            TransfQualidade.itensDefeito[index].qtde -= 1
        }
    }

    function estornarItemTabela(index, itens) {
        if (itens[index].qtde === 1) {
            itens.splice(index, 1)
        } else {
            itens[index].qtde -= 1
        }

        criarTabelaItens(itens)
    }

    function estornarItemBarra(item) {
        TransfQualidade.itensBarra = TransfQualidade.itensBarra.filter((it) => it.barra !== item.barra)
    }

    async function carregarValoresPadroes() {
        try {
            $.LoadingOverlay('show')
            const valores = await buscaValoresPadroes('TRANSF_DEPOSITO')
            const valoresFiltrados = valores.filter((item) => ['QUALIDADE_ORIGEM', 'QUALIDADE_DESTINO'].includes(item.CAMPO))
            valoresFiltrados.forEach((item) => {
                switch (item.CAMPO) {
                    case 'QUALIDADE_ORIGEM':
                        TransfQualidade.qualidadeOrigem = item.VALOR
                        break
                    case 'QUALIDADE_DESTINO':
                        TransfQualidade.qualidadeDestino = item.VALOR
                        break
                    default:
                        break
                }
            })
            if (!TransfQualidade.qualidadeOrigem) {
                msgErro('Qualidade de origem não configurada nos Valores Padrões > Transf. Depósito, impossível continuar.')
                return
            }
            if (!TransfQualidade.qualidadeDestino) {
                msgErro('Qualidade de destino não configurada nos Valores Padrões > Transf. Depósito, impossível continuar.')
                return
            }
        } finally {
            $.LoadingOverlay('hide')
        }
    }

    function adicionarItemEstoque(item) {
        const index = TransfQualidade.itensEstoque.findIndex((it) => it.codigo === item.codigo && it.cor === item.cor && it.tam === item.tam && it.depositoOrigem === item.depositoOrigem)

        if (index > -1) {
            TransfQualidade.itensEstoque[index].qtde += 1
        } else {
            const novoItem = {
                codigo: item.codigo,
                descricao: item.descricao,
                cor: item.cor,
                descCor: item.descCor,
                tam: item.tam,
                qtde: 1,
                depositoOrigem: item.depositoOrigem,
            }

            TransfQualidade.itensEstoque.push(novoItem)
        }
    }

    function adicionarItemFaccao(item) {
        const index = TransfQualidade.itensFaccao.findIndex((it) => it.numero === item.numero && it.codigo === item.codigo && it.cor === item.cor && it.tam === item.tam && it.parte === item.parte && it.setor === item.setor && it.mov === item.mov && it.movFac === item.movFac)

        if (index > -1) {
            TransfQualidade.itensFaccao[index].qtde += 1
        } else {
            const novoItem = {
                numero: item.numero,
                codigo: item.codigo,
                descricao: item.descricao,
                cor: item.cor,
                descCor: item.descCor,
                tam: item.tam,
                parte: item.parte,
                setor: item.setor,
                qtde: 1,
                mov: item.mov,
                movFac: item.movFac,
            }

            TransfQualidade.itensFaccao.push(novoItem)
        }
    }

    function adicionarItemDefeito(item, defeito) {
        const index = TransfQualidade.itensDefeito.findIndex((it) => it.numero === item.numero && it.codigo === item.codigo && it.cor === item.cor && it.tam === item.tam && it.parte === item.parte && it.setor === item.setor && it.mov === item.mov && it.defeito === defeito.chave)

        if (index > -1) {
            TransfQualidade.itensDefeito[index].qtde += 1
        } else {
            const novoItem = {
                numero: item.numero,
                codigo: item.codigo,
                cor: item.cor,
                tam: item.tam,
                parte: item.parte,
                setor: item.setor,
                qtde: 1,
                defeito: defeito.chave,
                descDefeito: defeito.descricao,
                mov: item.mov,
            }

            TransfQualidade.itensDefeito.push(novoItem)
        }
    }

    function adicionarItemTabela(item, defeito) {
        const itens = $('#tabelaItens').DataTable().data().toArray()
        const index = itens.findIndex((it) => it.numero === item.numero && it.codigo === item.codigo && it.cor === item.cor && it.tam === item.tam && it.depositoOrigem === item.depositoOrigem && it.defeito === defeito.chave)

        if (index > -1) {
            itens[index].qtde += 1
        } else {
            const novoItem = {
                numero: item.numero,
                codigo: item.codigo,
                descricao: item.descricao,
                cor: item.cor,
                descCor: item.descCor,
                tam: item.tam,
                qtde: 1,
                defeito: defeito.chave,
                descDefeito: defeito.descricao,
                depositoOrigem: item.depositoOrigem,
            }

            itens.push(novoItem)
        }

        criarTabelaItens(itens)
    }

    function criarTabelaItens(data = []) {
        if ($.fn.DataTable.isDataTable('#tabelaItens')) {
            $('#tabelaItens').DataTable().destroy()
            $('#tabelaItens').empty()
        }

        const columns = [
            {
                data: 'codigo',
                title: 'Código',
            },
            {
                data: 'descricao',
                title: 'Descrição',
            },
            {
                data: 'cor',
                title: 'Cor',
            },
            {
                data: 'descCor',
                title: 'Desc. Cor',
            },
            {
                data: 'tam',
                title: 'Tamanho',
            },
            {
                data: 'numero',
                title: 'Número OF',
            },
            {
                data: 'qtde',
                title: 'Quantidade',
                className: 'text-right',
            },
            {
                data: 'defeito',
                title: 'Defeito',
            },
            {
                data: 'descDefeito',
                title: 'Desc. Defeito',
            },
            {
                data: 'depositoOrigem',
                title: 'Depósito de Origem',
                visible: false,
            },
        ]

        $('#tabelaItens').DataTable({
            info: false,
            order: false,
            sort: false,
            paging: false,
            destroy: true,
            lengthChange: false,
            filter: false,
            autoWidth: true,
            data,
            columns,
            scrollX: true,
            scrollY: '35vh',
        }).draw(false)

        setTimeout(() => {
            $('#tabelaItens').DataTable().columns.adjust()
        }, 300)
    }

    function retornarDadosGravar() {
        const depositoDestino = pegaChave('#txtDepositoDestino')
        const tipoMov = pegaChave('#txtTipoMov')
        const qualidadeOrigem = TransfQualidade.qualidadeOrigem
        const qualidadeDestino = TransfQualidade.qualidadeDestino
        const documento = $('#txtDocumento').val()
        const codigoUsuario = getCookie('cod_usuario')
        const itensEstoque = TransfQualidade.itensEstoque
        const itensFaccao = TransfQualidade.itensFaccao
        const itensDefeito = TransfQualidade.itensDefeito
        const barrasLog = TransfQualidade.itensBarra.map((it) => it.barra)

        return {
            depositoDestino,
            tipoMov,
            qualidadeOrigem,
            qualidadeDestino,
            documento,
            codigoUsuario,
            itensEstoque,
            itensFaccao,
            itensDefeito,
            barrasLog,
        }
    }

    function validarDadosGravar(dados) {
        if (dados.itensEstoque.length === 0) {
            msgErro('Nenhum item a ser transferido, impossível continuar.')
            return false
        }

        if (!dados.qualidadeDestino) {
            msgErro('Qualidade de destino não informada, impossível continuar.')
            return false
        }

        if (!dados.tipoMov) {
            msgErro('Tipo de movimento não informado, impossível continuar.')
            return false
        }

        if (!dados.depositoDestino) {
            msgErro('Depósito de destino não informado, impossível continuar.')
            return false
        }

        return true
    }

    $('#btnGravar').on('click', async function () {
        try {
            $(this).prop('disabled', true)
            const dados = retornarDadosGravar()
            if (!validarDadosGravar(dados)) {
                return
            }
            gravar(dados)
        } finally {
            $(this).prop('disabled', false)
        }
    })

    async function gravar(dados) {
        try {
            $.LoadingOverlay('show')
            const response = await requisicao('POST', `/sisplan/transfqualidade/v1/dados?`, '', JSON.stringify(dados), 3600000)

            const json = await response.json()

            if (!json) {
                return
            }

            const { resultado, mensagem } = json
            if (mensagem?.codigo !== 200) {
                msgErro(mensagem?.mensagem)
                return
            }

            if (!resultado) {
                throw Error()
            }

            toastr.success("Dados gravados com sucesso!", "Confirmação", {
                toastClass: "alert",
                iconClasses: {
                    error: "alert-error",
                    info: "alert-info",
                    success: "alert-success",
                    warning: "alert-warning",
                },
                positionClass: "toast-top-center",
                progressBar: true,
                timeOut: 1000,
                fadeOut: 1000,
                onHidden() {
                    const documento = $('#txtDocumento').val()
                    msgAlerta(
                        `Documento: ${documento}\nDeseja gerar novas etiquetas para os itens transferidos?`,
                        () => {
                            parent.fecharAba('reltag', 'Relatório de Tag')
                            sessionStorage.setItem('documentoTransfQualidade', documento)
                            parent.abrirEmNovaAbaIFrame('Relatório de Tag', `${BASE_URI}/reltag/create`)
                            limpar()
                            buscarDocumento()
                        },
                        () => {
                            limpar()
                            buscarDocumento()
                        },
                        undefined,
                        () => {
                            limpar()
                            buscarDocumento()
                        },
                        true,
                    )
                },
            }).css({
                "margin-top": "20%",
                width: "500px",
                "max-width": "500px",
            })
        } catch (error) {
            console.error(error)
            msgErro('Não foi possível gravar os dados.')
        } finally {
            $.LoadingOverlay('hide')
        }
    }

    function limpar() {
        TransfQualidade.itensEstoque = []
        TransfQualidade.itensFaccao = []
        TransfQualidade.itensDefeito = []
        TransfQualidade.itensBarra = []
        $('#txtTipoMov').val('')
        $('#txtDepositoOrigem').val('')
        $('#txtDepositoDestino').val('')
        $('#txtDefeito').val('')
        criarTabelaItens([])
    }

    $('#btnLimpar').on('click', function () {
        limpar()
    })



    adicionarConteudoModal(
        'Transferência de Qualidade', [
        {
            tipo: 'paragrafo',
            valor: 'Nessa tela é possível realizar a transferência de qualidade, da 1ª para a 2ª, de itens que foram bipados no último setor da movimentação de terceiros e entraram no estoque.',
        },
        {
            tipo: 'paragrafo',
            valor: 'Após uma ordem de produção ser finalizada e as peças tiverem entrado no estoque como 1ª qualidade, as barras log bipadas (outro tipo de barra não será aceito) para realizar essa operação poderão ser lidas nessa tela.',
        },
        {
            tipo: 'paragrafo',
            valor: 'Ao gravar os dados, caso os itens bipados possuírem quantidade o suficiente em estoque e na ordem de produção em 1ª qualidade, a transferência será realizada. Tanto no estoque quanto na ordem de produção, os itens passarão de 1ª para 2ª qualidade, não sendo necessário realizar o estorno na movimentação no último setor da ordem de produção.'
        },
        {
            tipo: 'paragrafo',
            valor: 'Além disso, como os itens passam para 2ª qualidade, devem apresentar algum defeito. Os defeitos adicionados para os itens bipados serão lançados ao realizar a transferência.'
        }
    ]
    );
})

window.TransfQualidade = window.TransfQualidade || {}

TransfQualidade.qualidadeOrigem = null
TransfQualidade.qualidadeDestino = null
TransfQualidade.itensEstoque = []
TransfQualidade.itensFaccao = []
TransfQualidade.itensDefeito = []
TransfQualidade.itensBarra = []