(function () {
    "use strict";

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

    function factory($http, $q) {

        var _get = function (codigo) {
            var deferred = $q.defer();
            var args = { 'codigo': codigo }
            $http.post('/entrada/get', 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,
                'codigo': filtro.codigo,
                'romaneioSaida': filtro.romaneioSaida,
                'filialOrigem': filtro.filialOrigem,
                '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('/entrada/getall', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _getAllSerieEntrada = function () {
            var deferred = $q.defer();
            $http.post('/entrada/GetAllSerieEntrada')
                .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,
                'romaneioSaida': filtro.romaneioSaida,
                'filialOrigem': filtro.filialOrigem,
                'terceiro': filtro.terceiro,
                'emissaoDe': filtro.emissao.de,
                'emissaoAte': filtro.emissao.ate,
                'valorTotalDe': filtro.valorTotal.de,
                'valorTotalAte': filtro.valorTotal.ate
            }
            $http.post('/entrada/count', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _getItensParaDevolucao = function (auxiliar) {
            debugger
            var deferred = $q.defer();
            var args = {
                'chaves': auxiliar.itemEntrada.filtro.chaves,
                'codigoTerceiro': auxiliar.itemEntrada.filtro.codigoTerceiro,
                'codigoEntrada': auxiliar.itemEntrada.filtro.codigoEntrada,
                'skip': auxiliar.itemEntrada.filtro.skip,
                'take': auxiliar.itemEntrada.filtro.take,
            }
            $http.post('/entrada/getitensparadevolucao', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _countItensParaDevolucao = function (filtro) {
            var deferred = $q.defer();
            var args = {
                'chaves': filtro.chaves,
                'codigoTerceiro': filtro.codigoTerceiro,
                'codigoEntrada': filtro.codigoEntrada,
            }
            $http.post('/entrada/countitensparadevolucao', 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('/entrada/preparenew')
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _prepareNewItem = function (entrada, codigoProduto) {
            var deferred = $q.defer();
            var args = {
                entrada: entrada,
                codigoProduto: codigoProduto
            };
            $http.post('/entrada/preparenewitem', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _calculate = function (entrada) {
            debugger;
            var deferred = $q.defer();
            var args = { entrada: entrada };
            $http.post('/entrada/calculate', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _alteratipoMoovimentacao = function (tipoMovimentacao) {
            ;
            var deferred = $q.defer();
            var args = { tipoMovimentacao: tipoMovimentacao };
            $http.post('/entrada/alteratipoMoovimentacao', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _calculateItemPedido = function (item) {
            var deferred = $q.defer();
            var args = { item: item };
            $http.post('/entrada/calculateItemPedido', 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('/entrada/save', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _saveNewTransferencia = function (codigoTransito, itensTransito) {
            var deferred = $q.defer();
            var args = { codigoTransito: codigoTransito, itensTransito: itensTransito };
            $http.post('/entrada/savenewtransferencia', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _saveNewCompras = function (notaFiscal, itensCompras) {
            var deferred = $q.defer();
            var args = {
                notaFiscal: notaFiscal,
                itensCompras: itensCompras
            };
            $http.post('/entrada/savenewcompras', 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('/entrada/setcancelada', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _setConferida = function (codigo) {
            var deferred = $q.defer();
            var args = { codigo: codigo };
            $http.post('/entrada/setconferida', 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('/entrada/setencerrada', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _SetItensCompra = function (itens) {
            var deferred = $q.defer();
            var args = { 'lst': itens };
            $http.post('/entrada/SetItensCompra', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        }
        var _CompareItens = function (file) {
            var deferred = $q.defer();
            $http.post('/entrada/CompareItens', file, {
                transformRequest: angular.identity,
                headers: { 'Content-Type': undefined }
            })
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

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

        var _saveItens = function (item, itens) {
            var deferred = $q.defer();
            var args = { item: item, itens: itens };

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

        
        var _AddProdutoCegoCompra = function (codigo, lista) {
            var deferred = $q.defer();
            var args = { codigo: codigo, produtos: lista };

            $http.post('/entrada/AddProdutoCegoCompra', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        }
        var _addProdutoCega = function (codigo, cor, codigoTabelaPreco, lista, itensOriginais) {
            var deferred = $q.defer();
            var args = { codigo: codigo, cor: cor, codigoTabelaPreco: codigoTabelaPreco, produtos: lista, itensOriginais };

            $http.post('/entrada/AddProdutoCega', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        }
        var _addProdutoCegaEntrada = function (codigo, cor, codigoTabelaPreco, lista, codigoTransito) {
            var deferred = $q.defer();
            var args = { codigo: codigo, cor: cor, codigoTabelaPreco: codigoTabelaPreco, produtos: lista, codigoTransito };

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

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

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

        var _AddProduto = function (codigo, lista) {
            var deferred = $q.defer();
            var args = { codigo: codigo, produtos: lista };

            $http.post('/entrada/AddProdutoCegoCompra', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        }
        var _AddProdutoCegoCompra = function (codigo, lista) {
            var deferred = $q.defer();
            var args = { codigo: codigo, produtos: lista };

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

        var _SetLinhaProduto = function (produtosAlterados, lista) {
            var deferred = $q.defer();
            var args = { produtosAlterados: produtosAlterados, produtos: lista };

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

        var _GetLinhaProduto = function (produto, cor, lista) {
            var deferred = $q.defer();
            var args = { produto: produto, cor: cor, produtos: lista };

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

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

        var _RevomeSession = function () {
            var deferred = $q.defer();
            $http.post('/entrada/removeSession')
                .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('/entrada/removeItem', item)
                .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,
            getItensParaDevolucao: _getItensParaDevolucao,
            countItensParaDevolucao: _countItensParaDevolucao,
            prepareNew: _prepareNew,
            prepareNewItem: _prepareNewItem,
            calculate: _calculate,
            calculateItemPedido: _calculateItemPedido,
            save: _save,
            saveNewTransferencia: _saveNewTransferencia,
            saveNewCompras: _saveNewCompras,
            setCancelada: _setCancelada,
            setConferida: _setConferida,
            setEncerrada: _setEncerrada,
            CompareItens: _CompareItens,
            SetItensCompra: _SetItensCompra,
            CheckXmlFile: _CheckXmlFile,
            saveItens: _saveItens,
            getAllSerieEntrada: _getAllSerieEntrada,
            addProdutoCega: _addProdutoCega,
            recalculaPrecos: _recalculaPrecos,
            AddProdutoCegoCompra: _AddProdutoCegoCompra,
            GetLinhaProduto: _GetLinhaProduto,
            SetLinhaProduto: _SetLinhaProduto,
            calculateItemPedido: _calculateItemPedido,
            addProdutoCegaEntrada: _addProdutoCegaEntrada,
            revomeSession: _RevomeSession,
            removeItem: _removeItem,
            alteratipoMoovimentacao: _alteratipoMoovimentacao
        };
    }

})();