(function () {
    "use strict";

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

    function factory($http, $q) {

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

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


        var _GetClienteMarca = function (codigo) {
            var deferred = $q.defer();
            var args = { 'codigocliente': codigo }
            $http.post('/cliente/GetClienteMarca', 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('cliente/save', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };
        var _saveUpdate = function (item) {
            var deferred = $q.defer();
            var args = {
                item: item
            };
            $http.post('cliente/update', 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('/cliente/prepareNew')
                .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,
                'codigocliente': filtro.codigocliente,
                'cpf': filtro.cpf,
                'fone': filtro.fone,
                'genero': filtro.genero,
                'ultimaCompraDe': filtro.ultimaCompra.de,
                'ultimaCompraAte': filtro.ultimaCompra.ate,
                'mesAniversario': filtro.mesAniversario,
                'idadeDe': filtro.idade.de,
                'idadeAte': filtro.idade.ate,
                'skip': filtro.skip,
                'take': filtro.take
            };
            
            $http.post('/cliente/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,
                'codigocliente': filtro.codigocliente,
                'cpf': filtro.cpf,
                'fone': filtro.fone,
                'genero': filtro.genero,
                'ultimaCompraDe': filtro.ultimaCompra.de,
                'ultimaCompraAte': filtro.ultimaCompra.ate,
                'mesAniversario': filtro.mesAniversario,
                'idadeDe': filtro.idade.de,
                'idadeAte': filtro.idade.ate
            }
            $http.post('cliente/Count', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _getByCliente = function (chave) {
            var deferred = $q.defer();
            var args = { 'chave': chave, skip: 0, take: 10 };
            $http.post('/cliente/GetByCliente', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });

            return deferred.promise;
        };

        var _GetTopCliente = function (chave) {
            var deferred = $q.defer();
            var args = { 'chave': chave, take: 10 };
            $http.post('/cliente/GetTopCliente', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });

            return deferred.promise;
        };

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

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

        var _GetVendasClientes = function (filtro) {
            var deferred = $q.defer();
            var args = {
                dataCadastro: filtro.dataCadastro,
                dataInicio: filtro.dataInicio,
                dataFim: filtro.dataFim,
                nome: filtro.nome,
                cpf: filtro.cpf,
                telefone: filtro.telefone,
                colecao: filtro.colecao,
                mes: filtro.mes,
                valorMinimo: filtro.valorMinimo,
                qtdeMinima: filtro.qtdeMinima,
                grupo: filtro.grupo,
                numeroDias: filtro.numeroDias
            };

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

        var _GetDetalhesVendaCliente = function (filtro) {
            var deferred = $q.defer();
            var args = {
                dataCadastro: filtro.dataCadastro,
                dataInicio: filtro.dataInicio,
                dataFim: filtro.dataFim,
                nome: filtro.nome,
                cpf: filtro.cpf,
                telefone: filtro.telefone,
                colecao: filtro.colecao,
                mes: filtro.mes,
                valorMinimo: filtro.valorMinimo,
                qtdeMinima: filtro.qtdeMinima,
                grupo: filtro.grupo,
                numeroDias: filtro.numeroDias,
                codigoCliente: filtro.codigoCliente
            };

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

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

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

        var _getTokenDataBusca = function () {
            $http.defaults.headers.common['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, DELETE, PUT';
            $http.defaults.headers.common['Access-Control-Allow-Origin'] = 'http://localhost:59187';
            $http.defaults.headers.common['Access-Control-Allow-Headers'] = "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding";
            // Send this header only in post requests. Specifies you are sending a JSON object
            $http.defaults.headers.post['dataType'] = 'json'
            
            $http({
                url: 'http://wsrest.databusca.com.br/DataRest.svc/Login',
                method: "POST",
                data: { 'DomainId': 6183, 'UserName': 'marcelo.sguillo.ws', 'Password': 'Data@busca18' }
            })
.then(function (response) {
    // success
    
},
function (response) { // optional
    // failed
});
            var deferred = $q.defer();
            var args = JSON.parse('{"DomainId": "6183", "UserName": "marcelo.sguillo.ws", "Password": "Data@busca18" }');
             
            $http.post('http://wsrest.databusca.com.br/DataRest.svc/Login', args)
                .success(function (data) { deferred.resolve(data); })
                .error(function (data, status, headers, config) { deferred.reject(data); });
            return deferred.promise;
        };

        var _validarCadastroCompletoCliente = function (val, trocaAniversarioCliente) {
            var emailValido = val.Email != null && val.Email != undefined && val.Email != "";
            var telefoneValido = val.Telefone != null && val.Telefone != undefined && val.Telefone.Numero != "";
            var nascimentoValido = val.Aniversario != null && val.Aniversario != undefined;
            var generoValido = val.Genero != null && val.Genero != undefined;
            var enderecoValido = val.Endereco != null && val.Endereco != undefined;

            if (trocaAniversarioCliente)
                nascimentoValido = val.Aniversario != null && val.Aniversario != undefined && trocaAniversarioCliente;

            if (enderecoValido) {
                var cepValido = val.Endereco.CEP != null && val.Endereco.CEP != undefined;
                var ruaValida = val.Endereco.Linha1 != null && val.Endereco.Linha1 != undefined && val.Endereco.Linha1 != "";
                var numeroValido = val.Endereco.Linha2 != null && val.Endereco.Linha2 != undefined && val.Endereco.Linha2 != "";
                //var complementoValido = val.Endereco.Linha3 != null && val.Endereco.Linha3 != undefined && val.Endereco.Linha3 != "";

                var bairroValido = val.Endereco.Bairro != null && val.Endereco.Bairro != undefined && val.Endereco.Bairro != "";
                var cidadeValida = val.Endereco.Cidade.Nome != null && val.Endereco.Cidade.Nome != undefined && val.Endereco.Cidade.Nome != "";
                var ufValido = val.Endereco.Estado.Sigla != null && val.Endereco.Estado.Sigla != undefined && val.Endereco.Estado.Sigla != "";

                enderecoValido = (cepValido && ruaValida && numeroValido && bairroValido && cidadeValida && ufValido);
            }

            var clientePossuiCadCompleto = (emailValido && telefoneValido && nascimentoValido && generoValido && enderecoValido);
            return clientePossuiCadCompleto;
        }

        return {
            get: _get,
            save: _save,
            prepareNew: _prepareNew,
            getAll: _getAll,
            count: _count,
            getByCliente: _getByCliente,
            GetTopCliente: _GetTopCliente,
            saveUpdate: _saveUpdate,
            validaCpf: _validaCpf,
            validarCpfECnpj: _validarCpfECnpj,
            GetVendasClientes: _GetVendasClientes,
            GetDetalhesVendaCliente: _GetDetalhesVendaCliente,
            GetClientePadraoVenda: _GetClientePadraoVenda,
            getTokenDataBusca: _getTokenDataBusca,
            validarCadastroCompletoCliente: _validarCadastroCompletoCliente,
            GetClienteMarca: _GetClienteMarca,
            SetParticipaFidelidade: _SetParticipaFidelidade
        };
    }

})();