(function () {
    "use strict";

    angular.module('pos').controller('notaFiscalController', controller);
    controller.$inject = ['$scope', '$window', '$timeout', 'notaFiscalService', 'entidadeAuxiliarService', '$state'];

    function controller($scope, $window, $timeout, notaFiscalService, entidadeAuxiliarService, $state) {
        $scope.$parent.initializeLayout('Notas Fiscais');
        //[Inicializa objetos]
        $scope.state = {
            data: [],
            ModalInutilizacao: false,
            carregando: false,
            carregandoInutilizacao: false,
            carregandoExportacaoXml: false,
            vazio: false,
            count: 0,
            motivoInutilizacao: "",
            filtro: {
                ativo: false,
                chaves: '',
                emissao: { de: '', ate: '' },
                valorTotal: { de: null, ate: null },
                skip: 0,
                take: 20,
                modoExportacao: 'download'
            },
            Inutilizaveis: [],
            filtroInutilizaveis:
                {
                    serie: "",
                    modelo: "",
                    numeroDe: "",
                    numeroAte: "",
                    selecionadas: false
                },
            carregandoPaginacao: false,
            showPendingInvoices: $scope.$parent.config.ApresentarNotasPendentes,
            askToShowPendingInvoices: true,
        };
        $scope.auxiliar = {
            seriesNf: [],
            ordenacao: ["swap_vert", "keyboard_arrow_down", "keyboard_arrow_up"],
            ordenadorData: 0,
            ordenadorNumero: 0,
            especieSerie: [],
            serie: []
        }
        $scope.numberStyle = {};
        $scope.dateStyle = {};
        $scope.auxiliar.seriesNf = []
        //[Inicializa funcões]
        $scope.initialize = function () {
            var dat = new Date();
            $scope.state.filtro.emissao.de = addDays(dat, -7);
            $scope.refresh();
            $scope.getAllSerieNF();
            $scope.getAllEspecieSerie();
        };
        $scope.historyBack = function () {
            $window.history.back();
        };

        $scope.AbreModalInutilizacao = function () {
            if ($scope.state.ModalInutilizacao == true)
                $scope.state.ModalInutilizacao = false;
            else {
                $scope.state.ModalInutilizacao = true;

            }
        };

        $scope.toogleModalExportacaoXml = function () {
            if ($scope.state.modalExportacaoXml)
                $scope.state.modalExportacaoXml = false;
            else {
                $scope.state.modalExportacaoXml = true;

            }
        };

        $scope.Redirect = function (item) {
            if (item.NaturezaOperacao.Nome == 'PROTOCOLO DE INUTILIZAÇÃO') {
                $scope.$parent.toastr.warning('Registro informativo referente numeração de nota fiscal inutilizada', 'Registro Informativo');
                return;
            }


            $state.go("state-nota-fiscal-detail", { numero: item.Numero, serie: item.Serie.Codigo, terminal: item.Terminal.Codigo, chave: item.NFE.Chave });
        }
        $scope.InutilizarNotaClick = function () {
            //$scope.toggleModalCancelamento();
            if ($scope.state.filtroInutilizaveis.selecionadas && ($scope.state.filtroInutilizaveis.numeroDe == ""
                || $scope.state.filtroInutilizaveis.numeroAte == "" || $scope.state.filtroInutilizaveis.serie == "" || $scope.state.filtroInutilizaveis.modelo == "")) {
                $scope.$parent.toastr.error("Voce deve manter o filtro quando marcado para inutilizar a faixa completa!");
                return;
            }
            
            if ($scope.state.motivoInutilizacao.length < 15 || $scope.state.motivoInutilizacao.length > 255) {
                $scope.$parent.toastr.error("Voce deve digitar entre 15 e 255 caracteres no motivo!");
                return;
            }


            if (!$scope.state.motivoInutilizacao) {
                $scope.$parent.toastr.error("Voce deve digiar um motivo!");
                return;
            }
            $scope.state.carregandoInutilizacao = true;
            notaFiscalService.InutilizarNotas($scope.state.Inutilizaveis, $scope.state.motivoInutilizacao,
                $scope.state.filtroInutilizaveis.numeroDe, $scope.state.filtroInutilizaveis.numeroAte,
                $scope.state.filtroInutilizaveis.serie.Codigo, $scope.state.filtroInutilizaveis.modelo.NumeroModeloFiscal,
                $scope.state.filtroInutilizaveis.selecionadas).then(
                    function (response) {

                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Data, 'Serviço');
                        else {

                            if (response.Message)
                                $scope.$parent.toastr.success(response.Message, 'Serviço');
                            if (response.Data)
                                $scope.$parent.toastr.error(response.Data, 'Serviço');
                            $scope.state.carregandoInutilizacao = false;
                            $scope.AbreModalInutilizacao();
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                        $scope.state.carregandoInutilizacao = false;
                        $scope.AbreModalInutilizacao();
                    }
                );


        };
        $scope.getAllEspecieSerie = function () {

            entidadeAuxiliarService
                .getAllEspecieSerie()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Data, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.especieSerie);
                        $scope.getAllSerie();
                        
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        }
        $scope.getAllSerie = function (callback) {
            entidadeAuxiliarService
                .getAllSerieByEspecie($scope.state.filtroInutilizaveis.modelo)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Data, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.serie);
                        if (callback)
                            callback();
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        }

        $scope.GetAllInutilizaveis = function () {

            notaFiscalService.GetAllInutilizaveis($scope.state.filtroInutilizaveis.serie.Codigo, $scope.state.filtroInutilizaveis.modelo.NumeroModeloFiscal, $scope.state.filtroInutilizaveis.numeroDe, $scope.state.filtroInutilizaveis.numeroAte)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.Inutilizaveis)
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        }

        $scope.exportXmlZip = function (filtro) {
            var newFiltro = {
                chaves: filtro.chaves,
                cpf: '',
                emissaoDe: filtro.emissao.de,
                emissaoAte: filtro.emissao.ate,
                valorTotalDe: filtro.valorTotal.de,
                valorTotalAte: filtro.valorTotal.ate,
                sortexpression: filtro.ordenacao,
                order: '',
                tipoNota: filtro.codigoNf,
                statusNota: filtro.statusNota
            };

            $scope.state.carregandoExportacaoXml = true;

            try {
                notaFiscalService.exportXmlZip(newFiltro).then(
                    function (response) {
                        $scope.state.carregandoExportacaoXml = false;

                        if (response.byteLength == 0) {
                            $scope.$parent.toastr.info("Não foram encontrados XMLs com o filtro especificado.");
                            return;
                        }

                        var blob = new Blob([response], { type: "application/octet-stream" });
                        var fileName = "documentos-fiscais.zip";

                        if (navigator.msSaveOrOpenBlob) {
                            navigator.msSaveOrOpenBlob(blob, fileName);
                        } else {
                            var a = document.createElement("a");

                            document.body.appendChild(a);
                            a.href = window.URL.createObjectURL(blob);
                            a.download = fileName;
                            a.style = "display:none";
                            a.click();
                            window.URL.revokeObjectURL(url);
                            a.remove();
                        }
                    },
                    function (error) {
                        $scope.state.carregandoExportacaoXml = false;
                        console.error(error);
                    }
                );
            } catch (ex) {
                $scope.state.carregandoExportacaoXml = false;
                console.log(ex);
            }
        };

        $scope.exportXmlEmail = function (filtro) {
            var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
            var isEmailValid = re.test($scope.state.filtro.emailExportacao);


            if (!isEmailValid || $scope.state.filtro.emailExportacao == "" || !$scope.state.filtro.emailExportacao) {
                $scope.$parent.toastr.error('Digite um email válido.', 'Erro');
                return null;
            }

            $scope.state.carregandoExportacaoXml = true;

            var newFiltro = {
                chaves: filtro.chaves,
                cpf: '',
                emissaoDe: filtro.emissao.de,
                emissaoAte: filtro.emissao.ate,
                valorTotalDe: filtro.valorTotal.de,
                valorTotalAte: filtro.valorTotal.ate,
                sortexpression: filtro.ordenacao,
                order: '',
                tipoNota: filtro.codigoNf,
                statusNota: filtro.statusNota
            };

            notaFiscalService
                .emailXmlZip($scope.state.filtro.emailExportacao, newFiltro)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.state.carregandoExportacaoXml = false;
                            $scope.$parent.toastr.error('Encontramos problemas ao enviar o email. Tente novamente, ou utilize a opção download das notas.', 'Erro');
                        }
                        else {
                            $scope.state.carregandoExportacaoXml = false;
                            $scope.$parent.toastr.success('Email enviado com sucesso', 'Tudo Certo!');
                        }
                    },
                    function (error) {
                        $scope.state.carregandoExportacaoXml = false;
                    }
                );
            $scope.$parent.toastr.success('Em breve enviaremos um email com as notas', 'Processando Requisição...');
        };

        $scope.getAllSerieNF = function () {
            $scope.auxiliar.seriesNf = [{ Especie: { Codigo: "65", NumeroModeloFiscal: "65", Nome: "NFCe" } }, { Especie: { Codigo: "55", NumeroModeloFiscal: "55", Nome: "NFE" } }, { Especie: { Codigo: "59", NumeroModeloFiscal: "59", Nome: "CF e SAT" } }];
        }
        var CreateFilterType = function () {
            $scope.state.filtro.codigoNf = [];
            for (var i = 0; i < $scope.auxiliar.seriesNf.length; i++) {
                if ($scope.auxiliar.seriesNf[i].Checked)
                    $scope.state.filtro.codigoNf.push($scope.auxiliar.seriesNf[i].Especie.Codigo.toString());
                if ($scope.auxiliar.seriesNf[i].Especie.Codigo == '55' && $scope.auxiliar.seriesNf[i].Checked)
                    $scope.state.filtro.codigoNf.push("01");
            }
            if ($scope.state.filtro.codigoNf.length > 0)
                $scope.state.filtro.codigoNf = JSON.stringify($scope.state.filtro.codigoNf)
            else
                $scope.state.filtro.codigoNf = null;
        }
        $scope.getAll = function () {
            $scope.state.filtro.skip = 0;
            $scope.state.carregando = true;
            $scope.state.vazio = false;
            getOrdenacao();
            CreateFilterType();
            notaFiscalService
                .getAll($scope.state.filtro)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.state.data);

                        $scope.state.carregando = false;
                        $scope.state.vazio = ($scope.state.data == 0);
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        };
        $scope.count = function () {
            notaFiscalService
                .count($scope.state.filtro)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            $scope.state.count = response.Data;
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        };
        $scope.getMore = function () {
            $scope.state.filtro.skip += $scope.state.filtro.take;
            notaFiscalService
                .getAll($scope.state.filtro)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        }
                        else {
                            $scope.state.data = $scope.state.data.concat(response.Data);
                        }
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        };

        $scope.checkNFCe = function () {
            notaFiscalService
                .checkNFCe($scope.$parent.config.Terminal.IP)
                .then(
                    function (response) { if (response.Status < 0) $scope.$parent.toastr.error(response.Message, 'Serviço'); else $scope.$parent.toastr.info('Serviço de envio e impressão de NFC-e checado e funcionando.', 'Serviço'); },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        };

        $scope.refresh = function () {
            $scope.getAll();
            $scope.count();

        };
        $scope.clearFilter = function () {
            $scope.state.filtro.chaves = '';
            $scope.state.filtro.emissao.de = '';
            $scope.state.filtro.emissao.ate = '';
            $scope.state.filtro.valorTotal.de = null;
            $scope.state.filtro.valorTotal.ate = null;
            $scope.state.filtro.ordenacao = null;
            $scope.auxiliar.ordenadorData = 0;
            $scope.auxiliar.ordenadorNumero = 0;
            $scope.state.filtro.codigoNf = [];
            $scope.state.filtro.statusNota = "";
            $scope.refresh();
        };
        $scope.toggleFilter = function () {
            $scope.state.filtro.ativo = !$scope.state.filtro.ativo;
            if ($scope.state.filtro.ativo)
                $timeout(function () { $('[ng-model$="state.filtro.chaves"]').focus(); });
        };

        $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 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;
        }

        var addDays = function (dat, days) {
            dat = new Date(dat.valueOf());
            dat.setDate(dat.getDate() + days);
            return dat;
        }


        /*Inicializa funções*/
        $scope.initialize();
    }

})();