(function () {
    "use strict";

    angular.module('pos').controller('clienteDetailController', controller);
    controller.$inject = ['$scope', '$state', '$stateParams', '$window', 'clienteService', 'entidadeAuxiliarService', 'pedidoService', '$confirm'];

    function controller($scope, $state, $stateParams, $window, clienteService, entidadeAuxiliarService, pedidoService, $confirm) {
        $scope.$parent.initializeLayout('Cliente');

        //[Inicializa objetos]
        $scope.items = {
            data: { Codigo: $stateParams.id, CNPJMascara: '' },
            carregando: false,
            vazio: false,
            erro: {
                ativo: false,
                mensagem: ''
            }
        };
        $scope.auxiliar = {
            tipoCliente: { data: [] },
            estado: { data: [] },
            genero: { data: [] },
            estadoCivil: { data: [] },
            tipoTelefone: { data: [] },
            mensagemErro: "",
            modalErro: false,
        };
        $scope.params = {
            boleta: "",
            vendedor: ""
        }
        //[Inicializa funcões]
        $scope.initialize = function () {
            $scope.refresh();
            //;

        };
        $scope.historyBackWindow = function () {
            
            if (($scope.params.vendedor != "" || $scope.params.cliente != "" && $scope.params.boleta != "")) {
                pedidoService.ValidaVendaSuspensa().then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                            console.error(response.Exception);
                        } else {
                            if (response.Data) {

                                $state.go("state-cliente")
                            }
                            else {

                                $state.go("state-venda-add-cliente", { cliente: $scope.items.data.Codigo, vendedor: $scope.params.vendedor, boleta: $scope.params.boleta });
                            }
                        }

                    });
            }
            else
                $window.history.back();
        }
        $scope.historyBack = function () {
            
                $window.history.back();
        }
        $scope.get = function () {
            $scope.items.carregando = true;
            $scope.items.vazio = false;
            //var codigo = decodeURIComponent($scope.items.data.Codigo);
            var codigo = $stateParams.id;
            clienteService
                .get(codigo)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            $scope.items.data = response.Data;

                            if (response.Data.CPF && response.Data.CPF != "")
                                response.Data.CPF = response.Data.CPF.trim().replace(".", "").replace(".", "").replace("-", "");

                            if ($scope.items.data.PessoaFisica)
                                $scope.items.data.CPFMascara = $scope.items.data.CPF;
                            else
                                $scope.items.data.CNPJMascara = $scope.items.data.CPF;

                            var verificarClienteCadCompleto = $scope.$parent.config.NotificarCadIncompleto;
                            var clientePossuiCadastroCompleto = clienteService.validarCadastroCompletoCliente(response.Data, $scope.$parent.config.TrocaAniversarioCliente);
                            $scope.params.boleta = $stateParams.boleta;
                            $scope.params.vendedor = $stateParams.vendedor;
                            if (verificarClienteCadCompleto && !clientePossuiCadastroCompleto && $state.current.name != 'state-cliente-detail') {
                                $scope.$parent.toastr.error('Os campos com cor alterada devem ser preenchidos');
                            }
                        }

                        $scope.items.carregando = false;
                        $scope.items.vazio = ($scope.items.data == 0);
                    },
                    function (err) {
                        $scope.$parent.toastr.error(err);
                        $scope.items.carregando = false;
                        $scope.items.vazio = true;
                    }
                );
        };

        $scope.save = function () {
            if ($scope.items.data.PessoaFisica && $scope.items.data.CPFMascara != null)
                $scope.items.data.CPF = $scope.items.data.CPFMascara
            else
                $scope.items.data.CPF = $scope.items.data.CNPJMascara
            // items.data.CNPJMascara

            if ($scope.$parent.config.CadastroCPFObrigatorio) {
                save();
                return;
            }

            clienteService.validarCpfECnpj($scope.items.data.CPF).then(
                function (response) {
                    if (response.Data) {
                        if (response.Data) {
                            ;
                            save();
                        }
                        else
                            $scope.auxiliar.modalErro = true;
                    } else {
                        $scope.auxiliar.modalErro = true;
                    }
                },
                function (err) {
                    $scope.$parent.toastr.error(err);
                });

        }

        $scope.saveWithoutCPFValidation = function () {
            save();
        }

        $scope.toggleModalError = function () {
            $scope.auxiliar.modalErro = !$scope.auxiliar.modalErro;
        }

        var save = function () {

            var aniversarioValido = true;
            if ($scope.$parent.config.AniversarioObrigatorio || $scope.items.data.Aniversario != null)
                aniversarioValido = formataDataAniversario();
            else
                aniversarioValido = formataDataAniversario();

            if (!aniversarioValido) {
                $scope.$parent.toastr.error("Data de nascimento invalida!");
                return;
            }

            if ($scope.$parent.config.ObrigaCelularFidelidade && $scope.$parent.config.LancamentoFidelidade && $scope.items.data.Fidelidade) {
                if ($scope.items.data.Aniversario == null || $scope.items.data.Aniversario == "") {
                    $scope.$parent.toastr.error("Obrigatório preencher a Data de Nascimento quando o cliente participar do programa de fidelidade");
                    return;
                }

                if ($scope.items.data.Telefone == null || ($scope.items.data.Telefone.Numero == null || $scope.items.data.Telefone.Numero == "")) {
                    $scope.$parent.toastr.error("Obrigatório preencher o número de celular quando o cliente participar do programa de fidelidade");
                    return;
                }

                if ($scope.items.data.Telefone == null || (($scope.items.data.Telefone.Numero != null || $scope.items.data.Telefone.Numero != "") && ($scope.items.data.Telefone.DDD == "" || $scope.items.data.Telefone.DDD == null))) {
                    $scope.$parent.toastr.error("Preencha o DDD");
                    return;
                }
            }

            clienteService
                .save($scope.items.data)
                .then(
                    function (response) {
                        ;
                        if (response.Status < 0) {
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        }
                        else {
                            if ($scope.redirect && ($scope.params.vendedor == "" && $scope.params.cliente == "" && $scope.params.boleta == "")) {
                                $scope.$parent.toastr.success("Cliente salvo com sucesso");
                                $scope.historyBack();
                            }
                            else {
                                pedidoService.ValidaVendaSuspensa().then(
                                    function (response) {
                                        if (response.Status < 0) {
                                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                                            console.error(response.Exception);
                                        } else {
                                            if (response.Data) {
                                                $scope.$parent.toastr.success("Cliente salvo com sucesso");
                                                $scope.$parent.toastr.warning("Para adicionar o cliente a venda, é necessário encerrar a venda em aberto");
                                                $state.go("state-cliente")
                                            }
                                            else {
                                                $scope.$parent.toastr.success("Cliente salvo com sucesso");
                                                $state.go("state-venda-add-cliente", { cliente: $scope.items.data.Codigo, vendedor: $scope.params.vendedor, boleta: $scope.params.boleta });
                                            }
                                        }

                                    });
                            }
                        }
                    },
                    function (error) {
                        $scope.$parent.toastr.error('Ao salvar o cliente', 'Comunicação com o servidor');
                        console.error('Ao salvar o cliente', error);
                    }
                );
        }

        $scope.getAllTipoCliente = function () {
            entidadeAuxiliarService
                .getAllTipoCliente()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.tipoCliente.data);
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        };
        $scope.getAllEstado = function () {
            entidadeAuxiliarService
                .getAllEstado()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.estado.data);
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        };
        $scope.getAllEstadoCivil = function () {
            entidadeAuxiliarService
                .getAllEstadoCivil()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.estadoCivil.data);
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        };
        $scope.getAllGenero = function () {
            entidadeAuxiliarService
                .getAllGenero()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.genero.data);
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        };
        $scope.getAllTipoTelefone = function () {
            entidadeAuxiliarService
                .getAllTipoTelefone()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.tipoTelefone.data);
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        };
        $scope.getEndereco = function () {
            entidadeAuxiliarService
                .getEndereco($scope.items.data.Endereco.CEP)
                .then(
                    function (endereco) {
                        if (endereco) {
                            $scope.items.data.Endereco.CEP = endereco.cep.replace('-', '');
                            $scope.items.data.Endereco.Linha1 = endereco.logradouro;
                            $scope.items.data.Endereco.Linha3 = endereco.complemento;
                            $scope.items.data.Endereco.Bairro = endereco.bairro;
                            $scope.items.data.Endereco.Estado = { Nome: endereco.uf, CodigoIBGE: endereco.ibge.substring(0, 2), Sigla: endereco.uf };
                            $scope.items.data.Endereco.Cidade = { Nome: endereco.localidade, CodigoIBGE: endereco.ibge };

                            $('[ng-model$=Linha2]').focus();
                        }
                    },
                    function (err) { if (err) { $scope.$parent.toastr.error(err); } }
                );
        };
        $scope.refresh = function () {
            $scope.get();
            $scope.getAllTipoCliente();
            $scope.getAllEstado();
            $scope.getAllEstadoCivil();
            $scope.getAllGenero();
            $scope.getAllTipoTelefone();
        };

        $scope.salvarEVender = function () {

            //$scope.modalConfirmaFidelidade = true;
            $scope.redirect = false;
            if ($scope.items.data.Fidelidade == true)
                $scope.modalConfirmaFidelidade = true;
            else
                $scope.save(true);
        }

        $scope.submit = function () {

            $scope.redirect = true;
            if ($scope.items.data.Fidelidade == true)
                $scope.modalConfirmaFidelidade = true;
            else
                $scope.save(true);
        };

        $scope.validaCpf = function (cpf) {
            if ($state.current.name == "state-cliente-detail") {
                return;
            }
            clienteService.validaCpf($scope.items.data.CPFMascara).then(
                function (response) {
                    $scope.items.data.CpfInvalido = !response.Data;

                    if (!response.Data) {
                        $scope.$parent.toastr.error("CPF inválido");
                    }
                });
        }
        $scope.campoInvalido = function (campo) {

            var isInvalid = function (value) {
                var invalid = (value == null || value == "");
                return invalid;
            }

            if (!$scope.$parent.config.NotificarCadIncompleto)
                return false;

            switch (campo) {
                case 'email':
                    var value = clienteForm.email.value;
                    return isInvalid(value);
                    break;
                case 'telefoneDDD':
                    var value = clienteForm.telefoneDDD.value;
                    return isInvalid(value);
                    break;
                case 'telefoneNumero':
                    var value = clienteForm.telefoneNumero.value;
                    return isInvalid(value);
                    break;
                case 'aniversario':
                    var value = clienteForm.aniversario.value;
                    return isInvalid(value) && $scope.$parent.config.TrocaAniversarioCliente;
                    break;
                case 'genero':
                    var value = clienteForm.genero.value;
                    return isInvalid(value);
                    break;
                case 'cep':
                    var value = clienteForm.cep.value;
                    return isInvalid(value);
                    break;
                case 'endereco':
                    var value = clienteForm.endereco.value;
                    return isInvalid(value);
                    break;
                case 'numero':
                    var value = clienteForm.numero.value;
                    return isInvalid(value);
                    break;
                case 'complemento':
                    var value = clienteForm.complemento.value;
                    return isInvalid(value);
                    break;
                case 'bairro':
                    var value = clienteForm.bairro.value;
                    return isInvalid(value);
                    break;
                case 'cidade':
                    var value = clienteForm.cidade.value;
                    return isInvalid(value);
                    break;
                case 'estado':
                    if (clienteForm.estado.selectedOptions[0]) {
                        var value = clienteForm.estado.value.replace('?', '');
                        return isInvalid(value);
                    }
                    else {
                        return false;
                    }
                    break;
                default:
                    return false;
            }
        }

        var formataDataAniversario = function () {

            if (angular.isDate($scope.items.data.Aniversario))
                return true;

            var inputValue = $('[ng-model="items.data.Aniversario"]').val();
            /* se a data não foi completamente preenchida */
            if (!inputValue) {
                return true;
            }

            /* se foi apenas parcialmente preenchida */
            var error = false;

            var digitado = inputValue.split('/');
            var dayPart = digitado[0];
            var monthPart = digitado[1];

            if (dayPart == null || monthPart == null)
                var error = true;
            else if (dayPart > 31)
                error = true;
            else if (monthPart > 12)
                error = true;
            if (error == true) {
                $scope.items.data.Aniversario = null;
                return false;
            }
            if (inputValue.length == 5) {
                var d = new Date(Date.UTC(0, monthPart - 1, dayPart, 3, 0, 0, 0));

                if (d.getUTCDate() != dayPart || d.getUTCMonth() != (monthPart - 1)) {
                    error = true;
                }

            } else if (inputValue.length == 10) {
                var yearPart = digitado[2];
                var d = new Date(Date.UTC(yearPart, monthPart - 1, dayPart, 3, 0, 0, 0));

                if (d.getUTCDate() != dayPart || d.getUTCMonth() != (monthPart - 1) || d.getUTCFullYear() != yearPart) {
                    error = true;
                }
            }

            if (Object.prototype.toString.call(d) === "[object Date]") {
                // it is a date
                if (isNaN(d.getTime())) {  // d.valueOf() could also work
                    error = true;
                }

            }
            else {
                error = true;
            }
            if (error == true) {
                $scope.items.data.Aniversario = null;
                return false;
            }

            $scope.items.data.Aniversario = d;
            return true;
        }
        //Modal Confirma fidelidade
        {
            $scope.modalConfirmaFidelidade = false;
            $scope.aceitaFidelidade = false;
            $scope.aceitaContato = false;
            $scope.cancelaFidelidade = function () {
                //      $scope.items.data.Fidelidade = false;
                $scope.modalConfirmaFidelidade = false;
            }
            $scope.confirmaFidelidade = function () {

                if ($scope.aceitaFidelidade == false || $scope.aceitaContato == false) {
                    $scope.$parent.toastr.error("Voce deve aceitar os termos para que o cliente possa ser fidelizado!", 'Serviço');
                    return;
                }
                $scope.modalConfirmaFidelidade = false;

                $scope.save($scope.redirect);
                //$scope.items.data.Fidelidade = true;

            }
            $scope.ToogleFidelidade = function () {

                $scope.aceitaFidelidade = !$scope.aceitaFidelidade;
            }

            $scope.ToogleContato = function () {

                $scope.aceitaContato = !$scope.aceitaContato;
            }
        }
        $scope.confirmFidelidade = function () {
            if (!$scope.items.data.Fidelidade) {
                $scope.items.data.Fidelidade = true;
                $confirm({ text: "Ao desmarcar esta opção o cliente NÃO participará do programa de fidelidade, Deseja Confirmar?", title: "Desabilitar Fidelidade", ok: "Sim", cancel: "Não" })
                    .then(function () {
                        $scope.items.data.Fidelidade = false;
                    });
            } else if ($scope.items.data.Fidelidade) {
                $scope.items.data.Fidelidade = false;
                //$scope.modalConfirmaFidelidade = true;
                $confirm({ text: "Ao marcar esta opção o cliente passará a fazer parte do programa de fidelidade, Deseja Confirmar?", title: "Habilitar Fidelidade", ok: "Sim", cancel: "Não" })
                    .then(function () {
                        $scope.items.data.Fidelidade = true;
                    });
            }
        }

        /*Inicializa funções*/
        $scope.initialize();
    }

})();