(function () {
    "use strict";

    angular.module('pos').controller('reservaEditController', controller);
    controller.$inject = ['$scope', '$state', '$stateParams', '$window', 'reservaService', '$timeout', 'configService'];

    function controller($scope, $state, $stateParams, $window, reservaService, $timeout, configService) {
        $scope.Title = "Reserva";

        $scope.state = {
            changed: false,
            carregando: false,
            codigo: "",
            data: {},
            tabelaspreco: [],
            tiposreserva: [],
            mostraEventos: false,
            mostraEncerramento: false,
            textNovoEvento: "",
        };

        $scope.searchItemReserva = "";

        $scope.openEventos = function () {
            $scope.state.mostraEventos = true;
        }

        $scope.closeEventos = function () {
            $scope.state.mostraEventos = false;
        }

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

        $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.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;
                            $scope.$parent.toastr.success("A reserva foi salva com sucesso.", 'Sucesso');
                        }
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        }

        $scope.addEvento = function () {
            reservaService
                .saveEvent($scope.state.data.Codigo, $scope.state.textNovoEvento)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            $scope.state.data.Observacao = response.Data;
                            $scope.state.textNovoEvento = "";
                            $timeout(function () {
                                $('#textareaOBS').animate({ scrollTop: document.getElementById('textareaOBS').scrollHeight }, 400, function () { });
                            }, 100);
                            $scope.$parent.toastr.success("Evento confirmado com sucesso.", 'Sucesso');
                        }
                    },
                    function (err) { $scope.$parent.toastr.error(err); }
                );
        }

        $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.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;
            }


            if ($scope.state.data.Encerramento) {
                $scope.$parent.toastr.error("Reserva já está encerrada, não é possível incluir novos itens.", '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.enterCodigo = function ($event) {
            if ($event.keyCode == 10 || $event.keyCode == 13)
                $scope.pesquisaProduto();
        }

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

        $scope.openEncerrar = function () {
            $scope.state.mostraEncerramento = true;
        }

        $scope.closeEncerrar = function () {
            $scope.state.mostraEncerramento = false;
        }

        $scope.encerrarReserva = function () {
            reservaService
               .encerrarReserva($scope.state.data)
               .then(
                   function (response) {
                       if (response.Status < 0)
                           $scope.$parent.toastr.error(response.Message, 'Serviço');
                       else {
                           $scope.state.data = response.Data;
                           $scope.closeEncerrar();
                           $scope.$parent.toastr.success("A reserva foi encerrada com sucesso.", 'Sucesso');
                       }
                   },
                   function (err) { $scope.$parent.toastr.error(err); }
               );
        }


        $scope.getStatus = function (item) {

            if (item.Encerramento) {
                return "Encerrada";
            }

            var hoje = new Date();
            var expiraEm = Math.ceil((new Date(item.Retorno) - hoje) / 86400000);

            if (expiraEm < 0) {
                //expirada
                return "Expirada";
            }
            if (expiraEm < 3) {
                //expirando
                return "Expirando";
            }
            if (expiraEm < 7) {
                //breve
                return "Em Breve";
            }
            if (expiraEm >= 7) {
                //com tempo ainda
                return "Em dia";
            }
        };

        $scope.getStatusColor = function (item) {

            if (item.Encerramento) {
                return "label-default";
            }

            var hoje = new Date();
            var expiraEm = Math.ceil((new Date(item.Retorno) - hoje) / 86400000);

            if (expiraEm < 0) {
                //expirada
                return "label-danger";
            }
            if (expiraEm < 3) {
                //expirando
                return "label-warning";
            }
            if (expiraEm < 7) {
                //breve
                return "label-info";
            }
            if (expiraEm >= 7) {
                //com tempo ainda
                return "label-success";
            }
        };

        $scope.converterReserva = function () {
            reservaService
               .converterReserva($scope.state.data)
               .then(
                   function (response) {
                       if (response.Status < 0)
                           $scope.$parent.toastr.error(response.Message, 'Serviço');
                       else {
                           var pedido = response.Data;
                           pedido = pedido.replace("-", "");
                           $scope.refresh();

                           $scope.confirmtoastr = $scope.$parent.toastr.success("A reserva foi convertida em pré-venda de número #" + pedido + "<br /><br /><button type='button' class='btn btn-primary'>OK</button>", 'Sucesso',
                           {
                               closeButton: false,
                               allowHtml: true,
                               timeOut: 0,
                               extendedTimeOut: 0,
                               tapToDismiss: false,
                               onShown: function (toast) {
                                   $scope.oldparent = $scope.$parent;
                                   $(angular.element(toast.el[0]).find("button")).click(function () {
                                       $scope.oldparent.toastr.clear($scope.confirmtoastr);
                                   });
                               }
                           });
                       }
                   },
                   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 = '';

            }
        }

        var initialize = function () {
            $scope.getTabelasPreco();
            $scope.getTiposReserva();
            $scope.state.codigo = $stateParams.codigo;
            $scope.refresh();
        }

        initialize();

        $scope.$watch('state.data', function (valor, oldvalue) {
            if (!$scope.state.carregando) {
                $scope.state.changed = true;
            }
        }, true)

    }

})();