(function () {
    "use strict";

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

    function factory($http, $q) {

        var _get = function (codigo) {
            var deferred = $q.defer();
            var args = { 'codigo': codigo }
            $http.post('/saida/get', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _removeItem = function (item) {
            var deferred = $q.defer();
            $http.post('/saida/removeItem', item)
                .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,
                'codigo': filtro.codigo,
                'filialDestino': filtro.filialDestino,
                'terceiro': filtro.terceiro,
                'emissaoDe': filtro.emissao.de,
                'emissaoAte': filtro.emissao.ate,
                'valorTotalDe': filtro.valorTotal.de,
                'valorTotalAte': filtro.valorTotal.ate,
                'skip': filtro.skip,
                'take': filtro.take
            }
            $http.post('/saida/getall', 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,
                'codigo': filtro.codigo,
                'filialDestino': filtro.filialDestino,
                'terceiro': filtro.terceiro,
                'emissaoDe': filtro.emissao.de,
                'emissaoAte': filtro.emissao.ate,
                'valorTotalDe': filtro.valorTotal.de,
                'valorTotalAte': filtro.valorTotal.ate
            }
            $http.post('/saida/count', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _prepareNew = function () {
            var deferred = $q.defer();
            $http.post('/saida/preparenew')
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _prepareNewItem = function (saida, codigoProduto) {
            var deferred = $q.defer();
            var args = {
                saida: saida,
                codigoProduto: codigoProduto
            };
            $http.post('/saida/preparenewitem', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _addItemDevolucao = function (saida, itensDevolucao) {
            var deferred = $q.defer();
            var args = { saida: saida, itensDevolucao: itensDevolucao };
            $http.post('/saida/additemdevolucao', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

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

        var _save = function (item) {
            var deferred = $q.defer();
            var args = { item: item };
            $http.post('/saida/save', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _saveSelecionado = function (item) {
            var deferred = $q.defer();
            var args = { item: item };
            $http.post('/saida/saveSelecionado', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _saveNewSugestao = function (saida, itensSugestaoTransferencia) {
            var deferred = $q.defer();
            var args = {
                saida: saida,
                itensSugestaoTransferencia: itensSugestaoTransferencia
            };
            $http.post('/saida/savenewsugestao', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _setCancelada = function (codigo) {
            var deferred = $q.defer();
            var args = { codigo: codigo };
            $http.post('/saida/setcancelada', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _setEncerrada = function (codigo) {
            var deferred = $q.defer();
            var args = { codigo: codigo };
            $http.post('/saida/setencerrada', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

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

        var _getNaturezasByRomaneioSaida = function (romaneioProduto) {
            var deferred = $q.defer();
            var args = { romaneioProduto: romaneioProduto };
            $http.post('/saida/GetNaturezasByRomaneioSaida', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _gerarNotaSaida = function (filial, romaneio, serie, natureza, data, volume, informacaoAdicional, transportadora, peso, tipoFrete, Frete) {
            var deferred = $q.defer();
            var args = {
                filial: filial,
                romaneio: romaneio,
                serie: serie,
                natureza: natureza,
                data: data,
                volume: volume,
                informacaoAdicional: informacaoAdicional,
                transportadora: transportadora,
                peso: peso,
                tipoFrete: tipoFrete,
                Frete: Frete
            };
            $http.post('/saida/GerarNotaSaida', 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, romaneio) {
            
            var deferred = $q.defer();
            var args = { nfnumero: nfnumero, serie: serie, filial: filial,romaneio: romaneio };
            $http.post('/saida/EnviaNotaSefaz', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _GetXmlSefaz = function (nfnumero, serie, filial) {

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

        var _GetXmlSefazDownloadç = function (nfnumero, serie, filial) {

            var args = { nfnumero: nfnumero, serie: serie, filial: filial };

            return $http({
                method: 'GET',
                url: '/saida/GetXmlSefazDownload',
                params: args,
                responseType: 'arraybuffer'
            });
        };

        var _GetXmlSefazDownload = function (nfnumero, serie, filial) {

            var args = { nfnumero: nfnumero, serie: serie, filial: filial };

            return $http({
                method: 'GET',
                url: '/saida/GetXmlSefazDownload',
                params: args,
                responseType: 'arraybuffer'
            });
        };

        var _recalculaPrecos = function (codigoTabelaPreco, listaProdutos) {
            var deferred = $q.defer();
            var args = { codigo: codigoTabelaPreco, lista: listaProdutos };

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


        return {
            get: _get,
            getAll: _getAll,
            count: _count,
            prepareNew: _prepareNew,
            prepareNewItem: _prepareNewItem,
            addItemDevolucao: _addItemDevolucao,
            calculate: _calculate,
            save: _save,
            saveSelecionado: _saveSelecionado,
            saveNewSugestao: _saveNewSugestao,
            setCancelada: _setCancelada,
            setEncerrada: _setEncerrada,
            getNaturezas: _getNaturezas,
            getNaturezasByRomaneioSaida: _getNaturezasByRomaneioSaida,
            gerarNotaSaida: _gerarNotaSaida,
            EnviaNotaSefaz: _EnviaNotaSefaz,
            GetXmlSefaz: _GetXmlSefaz,
            GetXmlSefazDownload: _GetXmlSefazDownload,
            recalculaPrecos: _recalculaPrecos,
            removeItem: _removeItem
        };
    }

})();