(function () {
    "use strict";

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

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

        //[Inicializa objetos]
        $scope.items = {
            data: {},
            carregando: false,
            vazio: false,
            erro: {
                ativo: false,
                mensagem: ''
            },
            tokenApiManager: '',
            dataFormatada:'',
        };
        $scope.auxiliar = {
            tipoCliente: { data: [] },
            estado: { data: [] },
            genero: { data: [] },
            estadoCivil: { data: [] },
            tipoTelefone: { data: [] },
            modalErro: false,
        };

        //[Inicializa funcões]
        $scope.initialize = function () {
            $scope.prepareNew();
            $scope.refresh();
        };

        $scope.getTokenParametroManager = function () {
            parametroService
                .getToken()
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            console.error(response.Exception);
                        } else {
                            $scope.items.tokenApiManager = response.Data;
                            $scope.getParametrosCadastroCompleto();
                        }
                    },
                    function (error) {
                        console.error(error);
                    }
                );
        };
        $scope.getParametrosCadastroCompleto = function () {
            parametroService
                .getParametrosCadastroCompleto($scope.items.tokenApiManager)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            console.error(response.Exception);
                        }
                    },
                    function (error) {
                        console.error(error);
                    }
                );
        };

        $scope.prepareNew = function () {
        
            $scope.items.carregando = true;
            $scope.items.vazio = false;
            clienteService
                .prepareNew()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            $scope.items.data = response.Data;

                        $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.CPF = $scope.items.data.CPFMascara
            else
                $scope.items.data.CPF = $scope.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);
                });
        }
       
        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.items.data.PessoaFisica)
                $scope.items.data.CPF = $scope.items.data.CPFMascara
            else
                $scope.items.data.CPF = $scope.items.data.CNPJMascara
            
            // Validação de endereço para quando o cliente participar do programa de fidelidade
            //var arr = [];
            //var enderecoIncompleto = '';
            
            //if ($scope.$parent.config.ObrigaCelularFidelidade && $scope.$parent.config.LancamentoFidelidade && $scope.items.data.Fidelidade) {
            //    if ($scope.items.data.Endereco != null){
            //        if ($scope.items.data.Endereco.Linha1 == null || $scope.items.data.Endereco.Linha1 == "")
            //            arr.push('Endereço')
            //        if ($scope.items.data.Endereco.Linha2 == null || $scope.items.data.Endereco.Linha2 == "")
            //            arr.push('Numero') 
            //        if ($scope.items.data.Endereco.Bairro == null || $scope.items.data.Endereco.Bairro == "")
            //            arr.push('Bairro')
            //        if ($scope.items.data.Endereco.Cidade == null || ($scope.items.data.Endereco.Cidade.Nome == null || $scope.items.data.Endereco.Cidade.Nome == ""))
            //            arr.push('Cidade')
            //        if ($scope.items.data.Endereco.Estado == null || ($scope.items.data.Endereco.Estado.Sigla == null || $scope.items.data.Endereco.Estado.Sigla == ""))
            //            arr.push('Estado')
            //    }
            //    else {
            //        $scope.$parent.toastr.error("Obrigatório preencher o endereço completo quando o cliente participar do programa de fidelidade");
            //        return;
            //    }

            //    arr.forEach(function (item) {
            //        enderecoIncompleto += item + ', ';
            //    });

            //    if (enderecoIncompleto != '') {
            //        enderecoIncompleto = enderecoIncompleto.substring(0, enderecoIncompleto.length - 2);
            //        $scope.$parent.toastr.error("Obrigatório preencher os campos ' " + enderecoIncompleto + " ' quando o cliente participar do programa de fidelidade");
            //        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 {
                            angular.copy(angular.fromJson(response.Data), $scope.items.data);
                            
                            if(response.Message)
                                $scope.$parent.toastr.warning(response.Message, 'Serviço');
                            if ($scope.redirect) {
                                $scope.historyBack();
                            } else {
                                pedidoService.ValidaVendaSuspensa().then(
                                     function (response) {
                                         if ($scope.redirect) {
                                             $scope.$parent.toastr.success("Cliente salvo com sucesso");
                                             $state.go("state-cliente")
                                         }
                                         else {
                                             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 });
                                                 }
                                             }
                                         }
                                     });
                            }
                        }

                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        }


        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;
        }
       
        $scope.saveWithoutCPFValidation = function () {
            save();
        }

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

        $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) { $scope.$parent.toastr.error(err); }
                );
        };
        $scope.refresh = function () {
            $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) {
            clienteService.validaCpf(cpf).then(
                function (response) {
                    $scope.items.data.CpfInvalido = !response.Data;
                    if (!response.Data) {
                        $scope.$parent.toastr.error("CPF inválido");
                    }
                });
        }
        $scope.validacaoFidelidadeCelular = function (celular, fidelidade) {
            if ($scope.$parent.config.ObrigaCelularFidelidade && $scope.$parent.config.LancamentoFidelidade && celular == null && fidelidade == true)
                $scope.$parent.toastr.error("Obrigatório preencher esse campo quando o cliente participar do programa de fidelidade");
        };
        $scope.validacaoFidelidadeAniversario = function (aniversario, fidelidade) {
            if ($scope.$parent.config.ObrigaCelularFidelidade && $scope.$parent.config.LancamentoFidelidade && aniversario == null && fidelidade == true)
                $scope.$parent.toastr.error("Obrigatório preencher esse campo quando o cliente participar do programa de fidelidade");
        }; 

        $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;
            }
        }
        //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;
                $scope.items.data.Fidelidade = false;
                $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();
    }

})();