(function () {
    "use strict";

    angular.module('pos').controller('reservaAddController', controller);
    controller.$inject = ['$scope', '$state', '$stateParams', '$window', '$timeout', '$q', '$filter', 'reservaService', 'entidadeAuxiliarService', '$http', 'clienteService', 'configService'];

    function controller($scope, $state, $stateParams, $window, $timeout, $q, $filter, reservaService, entidadeAuxiliarService, $http, clienteService, configService) {
        $scope.$parent.initializeLayout('Nova Reserva de Produtos');

        $scope.state = {
            data: {},
            carregando: false,
            tabelaspreco: [],
            tiposreserva: [],
        };
        $scope.loadingClientes = false;
        $scope.noResults = false;
        $scope.searchItemReserva = "";

        $scope.limparCliente = function () {
            $scope.state.data.Cliente = null;
        }

        $scope.selectCliente = function (val) {
            var erroCliente = "";

            if (val.Nome.trim().toLowerCase() != 'consumidor') {
                if (val.Nome.trim().length < 3)
                    erroCliente = "Nome do cliente tem menos de 3 caracteres.";

                if (val.NomeCompleto.trim().length < 3)
                    erroCliente = "Nome do cliente tem menos de 3 caracteres.";
            }

            if (val.PessoaFisica && val.CPF.trim().replace('.', '').replace('-', '').length != 11)
                erroCliente = "CPF do cliente não está correto.";
            else if (!val.PessoaFisica && val.CPF.trim().replace('.', '').replace('-', '').replace('/', '').length != 14)
                erroCliente = "CNPJ do cliente não está correto.";

            if (erroCliente != "") {
                $scope.$parent.toastr.error(erroCliente, 'Serviço');
                $scope.state.data.Cliente = null;
                return false;
            }

            $scope.state.data.Cliente = val;
        };

        $scope.lookupCliente = function (val) {
            return $q.when(
                clienteService
                .GetTopCliente(val)
                .then(function (response) {
                    if (response.Status < 0)
                        $scope.$parent.toastr.error(response.Message, "Serviço");
                    else
                        return response.Data;
                }));
        };

        $scope.historyBack = function () {
            $window.history.back();
        }

        $scope.setToday = function (tipo) {
            if (tipo == 1)
                $scope.state.data.Emissao = new Date();
            if (tipo == 2)
                $scope.state.data.Retorno = new Date();
            if (tipo == 3)
                $scope.state.data.Encerramento = new Date();
        }

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

        $scope.save = function () {

            if (!$scope.state.data.Cliente.Codigo) {
                $scope.$parent.toastr.error("Informe o cliente corretamente.", 'Atenção');
                return;
            }

            if (!$scope.state.data.TipoReserva.Codigo) {
                $scope.$parent.toastr.error("Informe o tipo de reserva corretamente.", 'Atenção');
                return;
            }

            if (!$scope.state.data.TabelaPreco.Codigo) {
                $scope.$parent.toastr.error("Informe a tabela de preço corretamente.", 'Atenção');
                return;
            }

            if (!$scope.state.data.Emissao) {
                $scope.$parent.toastr.error("Informe a data de emissão corretamente.", 'Atenção');
                return;
            }

            if (!$scope.state.data.Itens.length) {
                $scope.$parent.toastr.error("Informe pelo menos um produto para reserva.", 'Atenção');
                return;
            }



            reservaService
                .save($scope.state.data)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            $scope.state.data = response.Data;
                            $state.go("state-reserva-edit", { codigo: response.Data.Codigo }, { reload: false, location: 'replace' });
                        }
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        }

        $scope.limpaCodBarFocus = function () {
            $timeout(function () {
                $scope.searchItemReserva = "";
                $('[ng-model$="searchItemReserva"]').focus();
            });
        }

        $scope.pesquisaProduto = function () {

            if (!$scope.searchItemReserva)
            {
                $scope.$parent.toastr.error("Informe o código de barras corretamente.", 'Atenção');
                return;
            }

            if (!$scope.state.data.TabelaPreco || !$scope.state.data.TabelaPreco.Codigo) {
                $scope.$parent.toastr.error("Selecione uma tabela de preço para definir preço dos produtos a serem incluídos.", 'Atenção');
                return;
            }

            //enviar o codigo de barras e os itens atuais, retornar os itens ja adicionado o item enviado
            reservaService
                .addItem($scope.state.data, $scope.searchItemReserva)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.$parent.toastr.error(response.Message, 'Atenção');
                        }
                        else
                        {
                            angular.copy(response.Data, $scope.state.data.Itens);
                            $scope.recalculateTotal();
                        }
                        $scope.limpaCodBarFocus();
                    },
                    function (err) {
                        $scope.$parent.toastr.error(err);
                        $scope.limpaCodBarFocus();
                    }
                );


        }

        $scope.deleteItem = function (index) {
            $scope.state.data.Itens.splice(index, 1);
            $scope.recalculateTotal();
        };

        $scope.calculate = function (item) {
            var qtdeitem = 0;
            for (var i = 0; i < item.Tamanhos.length; i++) {
                qtdeitem += item.Tamanhos[i].Quantidade;
            }
            item.Quantidade = qtdeitem;
            item.Valor = qtdeitem * item.Preco;

            $scope.recalculateTotal();
        }

        $scope.recalculateTotal = function () {
            var qtdetotal = 0;
            var valortotal = 0;
            for (var i = 0; i < $scope.state.data.Itens.length; i++) {
                qtdetotal += $scope.state.data.Itens[i].Quantidade;
                valortotal += $scope.state.data.Itens[i].Valor;
            }
            $scope.state.data.QuantidadeTotal = qtdetotal;
            $scope.state.data.ValorTotal = valortotal;
        }

        $scope.getTabelasPreco = function () {
            configService.getAllTabelasPreco()
                .then(
                    function (response) {
                        if (response.Status < 0) { $scope.$parent.toastr.error(response.Message, 'Serviço'); }
                        else {
                            $scope.state.tabelaspreco = response.Data;
                        }
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        }

        $scope.getTiposReserva = function () {
            reservaService.getAllTiposReserva()
                .then(
                    function (response) {
                        if (response.Status < 0) { $scope.$parent.toastr.error(response.Message, 'Serviço'); }
                        else {
                            $scope.state.tiposreserva = response.Data;
                        }
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        }

        $scope.validaData = function (event) {
            var elem = $(event.target)[0];
            if (!elem || elem.value == "") return;
            var re = /^(((0[1-9]|[12][0-9]|3[01])([-.\/])(0[13578]|10|12)([-.\/])(\d{4}))|(([0][1-9]|[12][0-9]|30)([-.\/])(0[469]|11)([-.\/])(\d{4}))|((0[1-9]|1[0-9]|2[0-8])([-.\/])(02)([-.\/])(\d{4}))|((29)(\.|-|\/)(02)([-.\/])([02468][048]00))|((29)([-.\/])(02)([-.\/])([13579][26]00))|((29)([-.\/])(02)([-.\/])([0-9][0-9][0][48]))|((29)([-.\/])(02)([-.\/])([0-9][0-9][2468][048]))|((29)([-.\/])(02)([-.\/])([0-9][0-9][13579][26])))$/;
            if (!re.test(elem.value)) {
                $scope.$parent.toastr.warning("Data informada é inválida.");
                elem.value = "";
                if ($(elem).attr('ng-model') == "state.data.Emissao") $scope.state.data.Emissao = '';
                if ($(elem).attr('ng-model') == "state.data.Retorno") $scope.state.data.Retorno = '';
            }
        }

        $scope.initialize = function () {
            $scope.getTabelasPreco();
            $scope.getTiposReserva();
            $scope.prepareNew();
        };

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

})();