(function () {
    "use strict";

    angular.module('pos').controller('reservaController', controller);
    controller.$inject = ['$scope', '$window', 'reservaService', '$timeout'];

    function controller($scope, $window, reservaService, $timeout) {
        $scope.$parent.initializeLayout('Reserva');

        $scope.state = {
            filtro: {
                ativo: false,
                chaves: '',
                codigo: '',
                cliente: '',
                emissao: { de: '', ate: '' },
                valorTotal: { de: null, ate: null },
                status: "0",
            },
            filtrado: false
        };
        $scope.listaReservas = [];
        $scope.carregando = true;

        $scope.toggleFilter = function () {
            $scope.state.filtro.ativo = !$scope.state.filtro.ativo;
            if ($scope.state.filtro.ativo)
                $timeout(function () { $('[ng-model$="state.filtro.chaves"]').focus(); });
        };

        $scope.clearFilter = function () {
            $scope.state.filtrado = false;
            $scope.state.filtro.chaves = '';
            $scope.state.filtro.codigo = '';
            $scope.state.filtro.cliente = '';
            $scope.state.filtro.emissao.de = '';
            $scope.state.filtro.emissao.ate = '';
            $scope.state.filtro.valorTotal.de = null;
            $scope.state.filtro.valorTotal.ate = null;
            $scope.state.filtro.status = "0";

            $scope.refresh();
        };

        $scope.getReservas = function () {
            $scope.state.filtrado = (
                $scope.state.filtro.chaves ||
                $scope.state.filtro.codigo ||
                $scope.state.filtro.cliente ||
                $scope.state.filtro.emissao.de ||
                $scope.state.filtro.emissao.ate ||
                $scope.state.filtro.valorTotal.de ||
                $scope.state.filtro.valorTotal.ate ||
                $scope.state.filtro.status != "0"
            );

            if (typeof $scope.state.filtro.emissao.de == 'undefined') {
                $scope.$parent.toastr.error('Data de emissão inválida');
                return;
            }

            if ($scope.state.filtro.emissao.de <= new Date('1900-01-01')) {
                $scope.$parent.toastr.error('Data de emissão inválida');
                return;
            }

            if (typeof $scope.state.filtro.emissao.ate == 'undefined') {
                $scope.$parent.toastr.error('Data de emissão inválida');
                return;
            }

            if ($scope.state.filtro.emissao.ate <= new Date('1900-01-01')) {
                $scope.$parent.toastr.error('Data de emissão inválida');
                return;
            }

            $scope.carregando = true;
            reservaService.getReservas($scope.state.filtro).then(
                function (response) {
                    $scope.carregando = false;
                    if (response.Status < 0)
                        $scope.$parent.toastr.error(response.Message, 'Ocorreu um erro ao buscar as reservas de produtos');
                    else {
                        angular.copy(response.Data, $scope.listaReservas);
                    }
                },
                function (err) {
                    $scope.carregando = false;
                    $scope.$parent.toastr.error(err, "Erro de comunicação com o Servidor");
                }
            );
        };

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

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

        $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.filtro.emissao.de") $scope.state.filtro.emissao.de = '';
                if ($(elem).attr('ng-model') == "state.filtro.emissao.ate") $scope.state.filtro.emissao.ate = '';

            }
        }

        $scope.initialize = function () {
            $scope.refresh();
        };

        $scope.initialize();

    }

})();