(function () {
    "use strict";

    angular.module('pos').factory('notaFiscalService', factory);
    factory.$inject = ['$http', '$q'];

    function factory($http, $q) {

        var _get = function (numero, serie) {
            //if ((typeof serie) != 'string')
            //    serie = serie.Codigo;

            var deferred = $q.defer();
            var args = { 'numero': numero, serie: serie };
            $http.post('/notafiscal/get', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
    
        var _getByTerminalChave = function (numero, serie, terminal, chave) {
            //if ((typeof serie) != 'string')
            //    serie = serie.Codigo;

            var deferred = $q.defer();
            var args = { 'numero': numero, serie: serie, terminal: terminal, chave: chave };
            $http.post('/notafiscal/getByTerminalChave', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _GetAllInutilizaveis = function (serie, modelo, numeroDe, numeroAte) {
            var deferred = $q.defer();
            var args = { serie: serie, modelo: modelo, numeroDe: numeroDe, numeroAte: numeroAte };
            $http.post('/notafiscal/GetAllInutilizaveis', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        }

        var _InutilizarNotas = function(notas, motivo, numeroDe, numeroAte, serie, modelo, selecionadas)
        {
            var deferred = $q.defer();
            var args = { notas: notas, motivo: motivo, numeroDe: numeroDe, numeroAte: numeroAte, serie: serie, modelo:modelo, selecionadas: selecionadas };
            $http.post('/notafiscal/InutilizarNotas', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _InutilizarNota= function(nfnumero, nfserie, motivo)
            {
            var deferred = $q.defer();
            var args = { nfnumero: nfnumero, nfserie: nfserie, motivo:motivo };
            $http.post('/notafiscal/InutilizarNota', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _EmitirNotaReferencia = function (venda, filial, tipoEmissao) {
            var deferred = $q.defer();
            var args = { 'venda': venda, 'filial': filial, 'tipoEmissao': tipoEmissao };
            $http.post('/notafiscal/EmitirNotaReferencia', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _getAll = function (filtro) {
            var deferred = $q.defer();
            var args = {
                'chaves': filtro.chaves,
                'emissaoDe': filtro.emissao.de,
                'emissaoAte': filtro.emissao.ate,
                'valorTotalDe': filtro.valorTotal.de,
                'valorTotalAte': filtro.valorTotal.ate,
                'skip': filtro.skip,
                'take': filtro.take,
                'order': filtro.ordenacao,
                'tipoNota': filtro.codigoNf,
                'statusNota': filtro.statusNota,
            };
            $http.post('/notafiscal/getall', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _getAllPendentes = function () {
            var deferred = $q.defer();
            var args = {};
            $http.post('/notafiscal/GetAllPendentes')
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _reenviarNotasPendentes = function (notasPendentes) {
            var deferred = $q.defer();
            var args = { notasPendentes: notasPendentes };
            $http.post('/notafiscal/ReenviarNotasPendentes', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _InserirCancelamento = function (nfnumero, nfserie, justificativa, terminal) {
            var deferred = $q.defer();
            var args = {
                'NFNumero': nfnumero,
                'SerieNF': nfserie,
                'Justificativa': justificativa,
                'terminal': terminal
            };

            $http.post('/notafiscal/InserirCancelamento', args)
            .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _GetStatusCancelamento = function (nfnumero, nfserie) {
            
            var deferred = $q.defer();
            var args = {
                'NFNumero': nfnumero,
                'SerieNF': nfserie
            };
            $http.post('/notafiscal/GetStatusCancelamento', args)
            .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _Delete = function (nfnumero, nfserie) {
            var deferred = $q.defer();
            var args = {
                'NFNumero': nfnumero,
                'SerieNF': nfserie
            };
            $http.post('/notafiscal/Delete', args)
            .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _InserirCancelamentoByChaveNFE = function (nfnumero, nfserie, justificativa, terminal) {
           var deferred = $q.defer();

            var args = {
                'nfnumero': nfnumero,
                'nfserie': nfserie,
                'Justificativa': justificativa,
                'terminal': terminal
            };

            $http.post('/notafiscal/InserirCancelamentoByChaveNFE', args)
            .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _GetStatusCancelamentoByChaveNFE = function (chaveNFE) {
            
            var deferred = $q.defer();
            var args = {
                'ChaveNFE': chaveNFE
            };
            $http.post('/notafiscal/GetStatusCancelamentoByChaveNFE', args)
            .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _DeleteByChaveNFE = function (chaveNFE) {
            var deferred = $q.defer();
            var args = {
                'ChaveNFE': chaveNFE
            };
            $http.post('/notafiscal/DeleteByChaveNFE', args)
            .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _EnviaNotaSefaz = function (nfnumero, serie, filial) {
            var deferred = $q.defer();
            var args = { nfnumero: nfnumero, serie: serie, filial: filial };
            $http.post('/notafiscal/EnviaNotaSefaz', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _ReenviaNotaSefaz = function (nfnumero, serie, filial) {
            var deferred = $q.defer();
            var args = { nfnumero: nfnumero, serie: serie, filial: filial };
            $http.post('/notafiscal/ReenviarNotaSefaz', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _ReenvioForcado = function (nfnumero, serie, filial) {
            var deferred = $q.defer();
            var args = { nfnumero: nfnumero, serie: serie, filial: filial };
            $http.post('/notafiscal/ReenvioForcado', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _SendCorrecaoNFE = function (notaFiscal, correcao) {
            var deferred = $q.defer();

            var args = {
                'notaFiscal': notaFiscal,
                'correcao': correcao
            };

            $http.post('/notafiscal/SendCorrecaoNFE', args)
            .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _GetUltimoPdfCorrecaoNfe = function (notaFiscal) {
            var deferred = $q.defer();

            var args = { 'notaFiscal': notaFiscal };

            $http.post('/notafiscal/GetUltimoPdfCorrecaoNfe', args)
            .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _count = function (filtro) {
            var deferred = $q.defer();
            var args = {
                'chaves': filtro.chaves,
                'emissaoDe': filtro.emissao.de,
                'emissaoAte': filtro.emissao.ate,
                'valorTotalDe': filtro.valorTotal.de,
                'valorTotalAte': filtro.valorTotal.ate,
                'tipoNota': filtro.codigoNf,
                'statusNota': filtro.statusNota,
            };
            $http.post('/notafiscal/count', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _checkNFCe = function (impressoraIP) {
            var deferred = $q.defer();
            var args = { 'impressoraIP': impressoraIP };
            $http.post('/notafiscal/checknfce', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _getInfoChaveNFe = function (chave) {
            var deferred = $q.defer();
            var args = { 'chave': chave };
            $http.post('/notafiscal/getinfochavenfe', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _SetStatusReimpressao = function (nfnumero, serienf, codigofilial, idCfSat) {
            var deferred = $q.defer();
            var args = { 'nfnumero': nfnumero, 'serienf': serienf, 'codigofilial': codigofilial, 'idCfSat': idCfSat };
            $http.post('/notafiscal/SetStatusReimpressao', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _SendNfeEmail = function (ChaveNFE, email) {
            var deferred = $q.defer();
            var args = { 'ChaveNFE': ChaveNFE, 'email': email };
            $http.post('/notafiscal/SendNfeEmail', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };


        var _exportarExcel = function (inicio, fim, skip, take) {
            var deferred = $q.defer();
            var args = {
                'inicio': inicio,
                'fim': fim,
                'skip': skip,
                'take': take
            };
            $http.post('/notafiscal/exportarexcel', args)
            .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _exportarCSV = function (inicio, fim, skip, take) {
            var deferred = $q.defer();
            var args = {
                'inicio': inicio,
                'fim': fim,
                'skip': skip,
                'take': take
            };
            $http.post('/notafiscal/exportarcsv', args)
            .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _ziparXML = function (inicio, fim) {
            var deferred = $q.defer();
            var args = {
                'inicio': inicio,
                'fim': fim,
            };

            $http.post('/notafiscal/ziparxml', args)
            .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });

            return deferred.promise;
        };

        var _exportXmlZip = function (filtro) {
            var deferred = $q.defer();
            var args = filtro

            $http.post('/notafiscal/DownloadNotasXML', args, { responseType: 'arraybuffer' })
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });

            return deferred.promise;
        };

        var _emailXmlZip = function (email, filtro) {
            var deferred = $q.defer();
            var args = filtro;
            args.email = email;

            $http.post('/notafiscal/EmailNotasXml', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });

            return deferred.promise;
        };

        var _getSeriesParametro = function () {
            var deferred = $q.defer();
            $http.post('/notafiscal/getseriesparametro')
                .success(function (data) { deferred.resolve(data.Data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _getAllNotificacaoNotaFiscal = function () {
            var deferred = $q.defer();
            $http.post('/notafiscal/getAllNotificacaoNotaFiscal')
                .success(function (data) { deferred.resolve(data.Data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };


        var _setVisualizada = function (id) {
            var deferred = $q.defer();
            var args = { 'id': id };

            $http.post('/notafiscal/marcarComoLidaNotificacao', args)
                .success(function (data) { deferred.resolve(data.Data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _setVisualizadas = function () {
            var deferred = $q.defer();

            $http.post('/notafiscal/marcarComoLidasNotificacoes')
                .success(function (data) { deferred.resolve(data.Data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _reenviarNota = function (nota) {
            var deferred = $q.defer();
            var args = { 'numero': nota.NotaFiscal.Numero, 'serie': nota.NotaFiscal.Serie.Codigo, 'filial': nota.Filial.Codigo };
            $http.post('/notafiscal/reenviarNotaNotificacao')
                .success(function (data) { deferred.resolve(data.Data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _saveNotificacaoNotaSat = function () {
            var deferred = $q.defer();
            $http.post('/notafiscal/SaveNotificacaoSat')
                .success(function (data) { deferred.resolve(data.Data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        }


        var _getAllNotificacaoNotaSat = function() {
            var deferred = $q.defer();
            $http.post('/notafiscal/GetAllNotificacaoSat')
                .success(function (data) { deferred.resolve(data.Data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        }

        var _resendNotaRejeitada = function (numero, serieCodigo) {
            var deferred = $q.defer();
            var args = { 'numero': numero, 'serieCodigo': serieCodigo };
            $http.post('/notafiscal/ResendNotaRejeitada', args)
                .success(function (data) { deferred.resolve(data.Data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _resendAllNotaRejeitada = function () {
            var deferred = $q.defer();
            $http.post('/notafiscal/ResendAllNotaRejeitada')
                .success(function (data) { deferred.resolve(data.Data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        return {
            get: _get,
            getAll: _getAll,
            getAllPendentes: _getAllPendentes,
            reenviarNotasPendentes: _reenviarNotasPendentes,
            count: _count,
            checkNFCe: _checkNFCe,
            getInfoChaveNFe: _getInfoChaveNFe,
            InserirCancelamento: _InserirCancelamento,
            GetStatusCancelamento: _GetStatusCancelamento,
            Delete: _Delete,
            InserirCancelamentoByChaveNFE: _InserirCancelamentoByChaveNFE,
            GetStatusCancelamentoByChaveNFE: _GetStatusCancelamentoByChaveNFE,
            DeleteByChaveNFE: _DeleteByChaveNFE,
            SetStatusReimpressao: _SetStatusReimpressao,
            SendNfeEmail: _SendNfeEmail,
            exportXmlZip: _exportXmlZip,
            emailXmlZip: _emailXmlZip,
            ziparXML: _ziparXML,
            exportarExcel: _exportarExcel,
            exportarCSV: _exportarCSV,
            EnviaNotaSefaz: _EnviaNotaSefaz,
            ReenviaNotaSefaz: _ReenviaNotaSefaz,
            getSeriesParametro: _getSeriesParametro,
            getAllNotificacaoNotaSat: _getAllNotificacaoNotaSat,
            saveNotificacaoNotaSat: _saveNotificacaoNotaSat,
            getAllNotificacaoNotaFiscal: _getAllNotificacaoNotaFiscal,
            setVisualizada: _setVisualizada,
            setVisualizadas: _setVisualizadas,
            reenviarNota: _reenviarNota,
            InutilizarNota: _InutilizarNota,
            GetAllInutilizaveis: _GetAllInutilizaveis,
            InutilizarNotas: _InutilizarNotas,
            EmitirNotaReferencia: _EmitirNotaReferencia,
            getByTerminalChave: _getByTerminalChave,
            resendNotaRejeitada: _resendNotaRejeitada,
            resendAllNotaRejeitada: _resendAllNotaRejeitada,
            SendCorrecaoNFE: _SendCorrecaoNFE,
            GetUltimoPdfCorrecaoNfe: _GetUltimoPdfCorrecaoNfe,
            ReenvioForcado: _ReenvioForcado
        };
    }

})();