(function () {
    "use strict";

    angular.module('pos').controller('consumivelAddController', controller);
    controller.$inject = ['$scope', '$state', '$stateParams', '$window', '$alert', 'clienteService', 'entidadeAuxiliarService', 'consumivelService'];

    function controller($scope, $state, $stateParams, $window, $alert, clienteService, entidadeAuxiliarService, consumivelService) {
        $scope.Title = "Consumível";

        $scope.state = {
            filtro: { ativo: false, },
            passo: 0,
            cliente: { tipo: "CV", clientes: [], chaves: { nome: "", codigo: "" }, },
            naturezas: [],
            series: [],
            transportadoras: [],
            data: { NotaFiscal: {} },
        };

        $scope.auxiliar = {
            seriesNf: [],
            ordenacao: ["swap_vert", "keyboard_arrow_down", "keyboard_arrow_up"],
            ordenadorData: 0,
            ordenadorNumero: 0,
            tipoDestinatarioSelecionado: '',
            carregando: false
        }

        $scope.gotoNext = function () {
            ;
            if (validation($scope.state.passo) == false)
                return;

            if ($scope.state.passo < 1) {
                $scope.state.passo += 1;
            }
            else {
                save();
            }
        }

        var initilize = function () {
            $scope.refresh();
            //auxiliares
            getNaturezas();
            getAllSerie();
            buscarTransportadoras();
        }

        var validation = function (passo) {
            switch (passo) {
                case 0:
                    if (!$scope.state.data.NotaFiscal.NaturezaOperacao || $scope.state.data.NotaFiscal.NaturezaOperacao == null) {
                        $scope.$parent.toastr.error("Para avançar ao próximo passo, é necessário escolher uma natureza de operação.");
                        return false;
                    }
                    if (!$scope.state.data.NotaFiscal.Serie || $scope.state.data.NotaFiscal.Serie == null) {
                        $scope.$parent.toastr.error("Para avançar ao próximo passo, é necessário escolher uma série.");
                        return false;
                    }
                    break;
                case 1:
                    if ((!$scope.state.data.ClienteDestinatario || $scope.state.data.ClienteDestinatario.Nome == null) && (!$scope.state.data.FilialDestinatario || $scope.state.data.FilialDestinatario == null) && (!$scope.state.data.FornecedorDestinatario || $scope.state.data.FornecedorDestinatario == null)) {
                        $scope.$parent.toastr.error("Para avançar ao próximo passo, é necessário escolher um destinatário.");
                        return false;
                    }
                    break;
                    if (!$scope.state.data.ClienteDestinatario || $scope.state.data.ClienteDestinatario.Nome == null || !$scope.state.data.FilialDestinatario || $scope.state.data.FilialDestinatario == null || !$scope.state.data.FornecedorDestinatario || $scope.state.data.FornecedorDestinatario == null) {
                        $scope.$parent.toastr.error("Para avançar ao próximo passo, é necessário escolher um destinatário.");
                        return false;
                    }
                    break;
                    if (!$scope.state.data.NotaFiscal.Transportadora || $scope.state.data.NotaFiscal.Transportadora == null) {
                        $scope.$parent.toastr.error("Para avançar ao próximo passo, é necessário escolher uma transportadora.");
                        return false;
                    }
                    break;
            }
            return true;
        }

        $scope.gotoPrior = function () {
            if ($scope.state.passo > 0) {
                $scope.state.passo -= 1;
            }
        }

        $scope.setarDestinatario = function (destinatario) {
            $scope.state.data.ClienteDestinatario = {};
            $scope.state.data.FilialDestinatario = {};
            $scope.state.data.FornecedorDestinatario = {};

            switch ($scope.state.cliente.tipo) {
                case "CV":
                    $scope.state.data.ClienteDestinatario = destinatario;
                    $scope.auxiliar.tipoDestinatarioSelecionado = $scope.state.cliente.tipo;

                    consumivelService.validarEnderecoClienteVarejo(destinatario.Endereco).then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.$parent.toastr.error(Response.Message, "Serviço");
                                return;
                            } else {
                                $scope.auxiliar.destinatarioEnderecoIncompleto = response.Data;
                                if ($scope.auxiliar.destinatarioEnderecoIncompleto) {
                                    $scope.$parent.toastr.error("O cliente selecionado não possui endereço completo, edite seu cadastro clicando em seu nome para que seja possível prosseguir.");
                                }
                            }
                        },
                        function (error) {
                            $scope.$parent.toastr.error(error, "Serviço");
                            return;
                        }
                    );
                    break;
                case "FL":
                    $scope.state.data.FilialDestinatario = destinatario;
                    $scope.auxiliar.tipoDestinatarioSelecionado = $scope.state.cliente.tipo;
                    break;
                case "FO":
                    $scope.state.data.FornecedorDestinatario = destinatario;
                    $scope.auxiliar.tipoDestinatarioSelecionado = $scope.state.cliente.tipo;
                    break;
                case "CA":
                    $scope.state.data.FornecedorDestinatario = destinatario;
                    $scope.auxiliar.tipoDestinatarioSelecionado = $scope.state.cliente.tipo;
                    break;
            }

            $scope.state.cliente.nome = '';
            $scope.state.cliente.clientes = [];

            $scope.escolherDestinatario();
        }

        $scope.escolherDestinatario = function () {
            $scope.state.modalDestinatario = !$scope.state.modalDestinatario;
        }


        $scope.buscarDestinatario = function (chave) {
            if (!chave || chave == "") {
                $scope.state.cliente.clientes = [];
                return;
            }
            switch ($scope.state.cliente.tipo) {
                case "CV":
                    buscarClienteVarejo(chave);
                    break;
                case "FL":
                    buscarFilial(chave);
                    break;
                case "FO":
                    buscarFornecedor(chave);
                    break;
                case "CA":
                    buscarClienteAtacado(chave);
                    break;
            }
        }

        $scope.validaEnderecoDestinatario = function (destinatario) {
            return false;
        }

        var buscarClienteVarejo = function (chave) {
            clienteService.GetTopCliente(chave).then(
                function (response) {
                    $scope.state.cliente.clientes = response.Data;
                    $scope.state.cliente.chaves.nome = "Nome";
                    $scope.state.cliente.chaves.codigo = "Codigo";
                },
                function (error) {
                    $scope.$parent.toastr.error(error, "Serviço");
                }
                );
        }

        var buscarFornecedor = function (chave) {
            entidadeAuxiliarService.getTopFornecedor(chave).then(
               function (response) {
                   $scope.state.cliente.clientes = response.Data;
                   $scope.state.cliente.chaves.nome = "Nome";
                   $scope.state.cliente.chaves.codigo = "Codigo";
               },
               function (error) {
                   $scope.$parent.toastr.error(error, 'Serviço');
               });
        }

        var buscarFilial = function (chave) {
            entidadeAuxiliarService.getTopFilial(chave).then(
                function (response) {
                    $scope.state.cliente.clientes = response.Data;
                    $scope.state.cliente.chaves.nome = "Nome";
                    $scope.state.cliente.chaves.codigo = "Codigo";
                },
                function (error) {
                    $scope.$parent.toastr.error(error, "Serviço");
                }
                );
        }

        var buscarClienteAtacado = function (chave) {
            entidadeAuxiliarService.getTopClienteAtacado(chave).then(
                function (response) {
                    $scope.state.cliente.clientes = response.Data;
                    $scope.state.cliente.chaves.nome = "Nome";
                    $scope.state.cliente.chaves.codigo = "Codigo";
                },
                function (error) {
                    $scope.$parent.toastr.error(error, "Serviço");
                }
                );
        }

        var buscarTransportadoras = function () {
            entidadeAuxiliarService.getAllTransportadora().then(
                function (response) {
                    $scope.state.transportadoras = response.Data;
                },
                function (error) {
                    $scope.$parent.toastr.error(error, "Serviço");
                }
                );
        }


        $scope.changeOrdenacaoData = function () {
            $scope.auxiliar.ordenadorData = ($scope.auxiliar.ordenadorData == 2 ? 0 : ++$scope.auxiliar.ordenadorData);
            $scope.auxiliar.ordenadorNumero = 0;
            if ($scope.auxiliar.ordenadorData > 0) {
                $scope.dateStyle = { color: '#ffffff' };
                $scope.numberStyle = { color: '#666666' };
            }
            else {
                $scope.dateStyle = { color: '#666666' };
                $scope.numberStyle = { color: '#666666' };
            }

        }

        $scope.changeOrdenacaoNumero = function () {
            $scope.auxiliar.ordenadorNumero = ($scope.auxiliar.ordenadorNumero == 2 ? 0 : ++$scope.auxiliar.ordenadorNumero);
            $scope.auxiliar.ordenadorData = 0;
            if ($scope.auxiliar.ordenadorNumero > 0) {
                $scope.dateStyle = { color: '#666666' };
                $scope.numberStyle = { color: '#ffffff' };
            }
            else {
                $scope.dateStyle = { color: '#666666' };
                $scope.numberStyle = { color: '#666666' };
            }

        }

        var getNaturezas = function () {
            consumivelService.getNaturezas().then(
                function (response) {
                    $scope.state.naturezas = response.Data;
                },
                function (error) {
                    $scope.$parent.toastr.error(error, "Serviço");
                });
        }

        var getAllSerie = function () {
            
            entidadeAuxiliarService.getAllSerie().then(
                function (response) {
                    
                    $scope.state.series = response.Data.filter(a => a.Especie.NumeroModeloFiscal != '65' && a.Especie.NumeroModeloFiscal != '59');
                },
                function (error) {
                    $scope.$parent.toastr.error(error, "Serviço");
                });
        }

        var getOrdenacao = function () {
            var filtro = 0;
            if ($scope.auxiliar.ordenadorData > 0)
                filtro = $scope.auxiliar.ordenadorData - 1;
            else if ($scope.auxiliar.ordenadorNumero > 0)
                filtro = $scope.auxiliar.ordenadorNumero + 1;
            else
                filtro = null;

            $scope.state.filtro.ordenacao = filtro;
        }


        $scope.toggleFilter = function () {
            $scope.state.filtro.ativo = !$scope.state.filtro.ativo;
        };

        $scope.refresh = function () {
        };

        var save = function () {
            if (!$scope.auxiliar.carregando) {
                $scope.auxiliar.carregando = true;
                consumivelService.save($scope.state.data).then(
                    function (response) {
                        if (response.Status < 0) {
                            $alert({ text: response.Message, title: $scope.Title });
                            $scope.auxiliar.carregando = false;
                            return;
                        } else {
                            consumivelService
                            .gerarNotaConsumivel(response.Data.Codigo).then(
                                function (response) {
                                    
                                    if (response.Status < 0) {
                                        $scope.auxiliar.carregando = false;
                                        $scope.$parent.toastr.error(response.Message, "Comunicação com o servidor");
                                        return;
                                    }
                                    $scope.auxiliar.carregando = false;
                                    $scope.state.data = response.Data;
                                    $state.go('state-consumivel-edit', { id: $scope.state.data.Codigo });
                                },
                                function (error) {
                                    $scope.auxiliar.carregando = false;
                                    $scope.$parent.toastr.error(error, "Serviço");
                                });
                        }
                    },
                    function (error) {
                        $scope.auxiliar.carregando = false;
                        $scope.$parent.toastr.error(error, "Serviço");
                    }
                );
            }
        }


        initilize();
    }

})();