(function () {
    "use strict";

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

    function factory($http, $q) {

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

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


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


        var _getByReferencia = function (codigo) {
            var deferred = $q.defer();
            var args = { 'codigo': codigo }
            $http.post('/produto/GetByReferencia', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        
        var _getAllCatalog = function (filtro) {
            var deferred = $q.defer();
            var args = {
                'chaves': filtro.chaves,
                'codigo': filtro.codigo,
                'nome': filtro.nome,
                'tipo': filtro.tipo,
                'grupo': filtro.grupo,
                'subgrupo': filtro.subgrupo,
                'colecao': filtro.colecao,
                'linha': filtro.linha,
                'grife': filtro.grife,
                'fabricante': filtro.fabricante,
                'revenda': filtro.revenda,
                'codigoBarra': (!filtro.codigoBarra ? null : filtro.codigoBarra),
                'cor': (!filtro.cor ? null : filtro.cor),
                'filial': (!filtro.filial ? null : filtro.filial),
                'skip': filtro.skip,
                'take': filtro.take
            }
            $http.post('/produto/GetAllCatalog', 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,
                'nome': filtro.nome,
                'tipo': filtro.tipo,
                'grupo': filtro.grupo,
                'subgrupo': filtro.subgrupo,
                'colecao': filtro.colecao,
                'linha': filtro.linha,
                'grife': filtro.grife,
                'fabricante': filtro.fabricante,
                'revenda': filtro.revenda,
                'codigoBarra': (!filtro.codigoBarra ? null : filtro.codigoBarra),
                'cor': (!filtro.cor ? null : filtro.cor),
                'filial': (!filtro.filial ? null : filtro.filial),
                'skip': filtro.skip,
                'take': filtro.take
            }
            $http.post('/produto/GetAll', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _getAllEstoque = function (filtro) {
            var deferred = $q.defer();
            var args = {
                'chaves': filtro.chaves,
                'codigo': filtro.codigo,
                'nome': filtro.nome,
                'tipo': filtro.tipo,
                'grupo': filtro.grupo,
                'subgrupo': filtro.subgrupo,
                'colecao': filtro.colecao,
                'linha': filtro.linha,
                'grife': filtro.grife,
                'fabricante': filtro.fabricante,
                'revenda': filtro.revenda,
                'codigoBarra': (!filtro.codigoBarra ? null : filtro.codigoBarra),
                'cor': (!filtro.cor ? null : filtro.cor),
                'transito': (!filtro.transito ? 1 : filtro.transito),
                'filial': (!filtro.filial ? null : filtro.filial),
                'skip': filtro.skip,
                'take': filtro.take
            }
            $http.post('/produto/GetAllEstoque', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _countPecasEstoque = function (filtro) {
            var deferred = $q.defer();
            var args = {
                'chaves': filtro.chaves,
                'codigo': filtro.codigo,
                'nome': filtro.nome,
                'tipo': filtro.tipo,
                'grupo': filtro.grupo,
                'subgrupo': filtro.subgrupo,
                'colecao': filtro.colecao,
                'linha': filtro.linha,
                'grife': filtro.grife,
                'fabricante': filtro.fabricante,
                'revenda': filtro.revenda,
                'codigoBarra': (!filtro.codigoBarra ? null : filtro.codigoBarra),
                'cor': (!filtro.cor ? null : filtro.cor),
                'transito': (!filtro.transito ? 1 : filtro.transito),
                'filial': (!filtro.filial ? null : filtro.filial)
            }
            $http.post('/produto/CountQtdPecasEstoque', 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,
                'nome': filtro.nome,
                'tipo': filtro.tipo,
                'grupo': filtro.grupo,
                'subgrupo': filtro.subgrupo,
                'colecao': filtro.colecao,
                'linha': filtro.linha,
                'grife': filtro.grife,
                'fabricante': filtro.fabricante,
                'revenda': filtro.revenda,
                'codigoBarra': (!filtro.codigoBarra ? null : filtro.codigoBarra),
                'cor': (!filtro.cor ? null : filtro.cor),
                'filial': (!filtro.filial ? null : filtro.filial),
            }
            $http.post('/produto/Count', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _countEstoque = function (filtro) {
            var deferred = $q.defer();
            var args = {
                'chaves': filtro.chaves,
                'codigo': filtro.codigo,
                'nome': filtro.nome,
                'tipo': filtro.tipo,
                'grupo': filtro.grupo,
                'subgrupo': filtro.subgrupo,
                'colecao': filtro.colecao,
                'linha': filtro.linha,
                'grife': filtro.grife,
                'fabricante': filtro.fabricante,
                'revenda': filtro.revenda,
                'codigoBarra': (!filtro.codigoBarra ? null : filtro.codigoBarra),
                'cor': (!filtro.cor ? null : filtro.cor),
                'filial': (!filtro.filial ? null : filtro.filial),
                'transito': (!filtro.transito ? 1 : filtro.transito),
            }
            $http.post('/produto/CountEstoque', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

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

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

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

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

        var _getCodigosBarras = function (tamanho, cor, produto) {
            var deferred = $q.defer();
            var args = { 'tamanho': tamanho, 'cor': cor, 'produto': produto }
            $http.post('/produto/GetCodigosBarras', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };


        var _getEstoqueGerente = function (filtro) {
            var deferred = $q.defer();
            var args = {
                'codigo': filtro.codigo,
                'filial': filtro.filial,
                'transito': filtro.transito,
            }
            $http.post('/produto/getEstoqueGerente', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _getCodigosBarrasByTabelaPreco = function (tamanho, cor, produto, tabelaPreco) {
            var deferred = $q.defer();
            var args = { 'tamanho': tamanho, 'cor': cor, 'produto': produto, 'tabelaPreco': tabelaPreco }
            $http.post('/produto/GetCodigosBarrasByTabelaPreco', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _getEstoque = function (codigoBarra) {
            var deferred = $q.defer();
            var args = { 'codigoBarra': codigoBarra }
            $http.post('/produto/GetEstoque', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _getEstoqueProduto = function (produto) {
            var deferred = $q.defer();
            var args = { 'produto': produto }
            $http.post('/produto/GetEstoqueProduto', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _getConsultaByTabelaPreco = function (codigoBarra, codigoTabelaPreco) {
            var deferred = $q.defer();
            var args = {
                'codigoBarra': (!codigoBarra ? null : codigoBarra),
                'tabelaPreco': (!codigoTabelaPreco ? null : codigoTabelaPreco)
            }
            $http.post('/produto/GetConsultaByTabelaPreco', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _getConsultaByTabelaPrecoWithReferencia = function (codigoBarra, codigoTabelaPreco) {
            var deferred = $q.defer();
            var args = {
                'codigoBarra': (!codigoBarra ? null : codigoBarra),
                'tabelaPreco': (!codigoTabelaPreco ? null : codigoTabelaPreco)
            }
            $http.post('/produto/GetConsultaByTabelaPrecoWithReferencia', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

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

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

            var args = {
                'inicio': (!filtro.de ? null : filtro.de),
                'fim': (!filtro.ate ? null : filtro.ate),
                'filial': (!filtro.filial ? null : filtro.filial),
                'grife': (!filtro.grife ? null : filtro.grife),
                'colecao': (!filtro.colecao ? null : filtro.colecao),
                'grupo': (!filtro.grupo ? null : filtro.grupo),
                'produto': (!filtro.produto ? null : filtro.produto),
                'terminal': (!filtro.terminal ? null : filtro.terminal),
            }

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

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

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

        var _getProdutoEPreco = function (referencia, codigoTabelaPreco) {
            var deferred = $q.defer();
            var args = {
                'referencia': referencia,
                'tabelaPreco': codigoTabelaPreco
            }
            $http.post('/produto/GetProdutoEPreco', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

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

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



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


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

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


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

        return {
            gerarfile: _gerarfile,
            get: _get,
            getAll: _getAll,
            count: _count,
            getDataChartVendasAno: _getDataChartVendasAno,
            getCodigoBarra: _getCodigoBarra,
            getPreco: _getPreco,
            getEstoque: _getEstoque,
            getConsulta: _getConsulta,
            getConsultaByTabelaPreco: _getConsultaByTabelaPreco,
            getEstoqueProduto: _getEstoqueProduto,
            getCodigosBarras: _getCodigosBarras,
            getCodigosBarrasByTabelaPreco: _getCodigosBarrasByTabelaPreco,
            getAllItemsConsulta: _getAllItemsConsulta,
            getPrecoCores: _getPrecoCores,
            getPrecoCoresByTabelaPreco: _getPrecoCoresByTabelaPreco,
            getProdutoVendido: _getProdutoVendido,
            getAllEstoque: _getAllEstoque,
            countPecasEstoque: _countPecasEstoque,
            countEstoque: _countEstoque,
            getEstoqueGerente: _getEstoqueGerente,
            getProdutoEPreco: _getProdutoEPreco,
            imprimirListaEtiquetaProduto: _imprimirListaEtiquetaProduto,
            getProdutoImpressaoEtiqueta: _getProdutoImpressaoEtiqueta,
            salvarimpressaoetiqueta: _salvarimpressaoetiqueta,
            gettipoproduto: _gettipoproduto,
            getByReferencia :_getByReferencia,
            getallvariacao: _getallvariacao,
            getConsultaByTabelaPrecoWithReferencia: _getConsultaByTabelaPrecoWithReferencia,
            getAllCatalog: _getAllCatalog

        };
    }

})();