(function () {
    "use strict";

    angular.module('pos').controller('relatorioEvolucaoDeVendaController', controller);
    controller.$inject = ['$scope', '$window', '$state', 'relatorioService', '$filter', '$timeout'];

    function controller($scope, $window, $state, relatorioService, $filter, $timeout) {
        $scope.$parent.initializeLayout('Relatório');

        $scope.state = {
            tickets: {
                chart: { data: [], carregando: false, vazio: true },
                filtro: {},
            },
            produtos: {
                report: { data: [], carregando: false, vazio: true },
                totais: { quantidade: 0, representatividade: 0 },
            },
            vendedores: {
                report: { data: [], carregando: false, vazio: true },
                totais: { representatividade: 0 },
            },
        }

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

        function getDateWithoutTime(date) {
            var dateObj = new Date(date);
            var dateWithoutTime = dateObj.toLocaleDateString();

            return dateWithoutTime;
        }

        $scope.chartTicket = function () {
            $scope.state.tickets.chart.carregando = true;
            $scope.state.tickets.chart.vazio = false;
            relatorioService
                .chartEvolucaoVendas($scope.state.tickets.filtro)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.$parent.toastr.error(response.Message, 'Carregando gráfico');
                            console.error(response.Exception);
                        }
                        else {
                            angular.copy(angular.fromJson(response.Data), $scope.state.tickets.chart.data);
                            $scope.state.tickets.chart.vazio = $scope.$parent.tools.buildChart('#chart-ticket', '', response.Data, true);
                        }
                        $scope.state.tickets.chart.carregando = false;
                    },
                    function (error) {
                        $scope.$parent.toastr.error('Ao carregar o gráfico.', 'Comunicação com o servidor');
                        console.error(error);
                        $scope.state.tickets.chart.carregando = false;
                    }
                );
        };
        $scope.getTop5Produtos = function () {
            $scope.state.produtos.report.carregando = true;
            $scope.state.produtos.report.vazio = false;
            relatorioService
                .getTop5Produtos($scope.state.tickets.filtro)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                            console.error(response.Exception);
                        }
                        else {
                            angular.copy(angular.fromJson(response.Data), $scope.state.produtos.report.data);
                            $scope.state.produtos.report.vazio = (!response.Data || response.Data.length == 0);
                        }
                        $scope.totalizarProdutos(response.Data);
                        $scope.state.produtos.report.carregando = false;
                    },
                    function (error) {
                        $scope.$parent.toastr.error('Ao carregar o gráfico.', 'Comunicação com o servidor');
                        console.error(error);
                        $scope.state.produtos.report.carregando = false;
                    }
                );
        };
        $scope.getTop5Vendedores = function () {
            $scope.state.vendedores.report.carregando = true;
            $scope.state.vendedores.report.vazio = false;
            relatorioService
                .getTop5Vendedores($scope.state.tickets.filtro)
                .then(
                    function (response) {
                        if (response.Status < 0) {
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                            console.error(response.Exception);
                        }
                        else {
                            angular.copy(angular.fromJson(response.Data), $scope.state.vendedores.report.data);
                            $scope.state.vendedores.report.vazio = (!response.Data || response.Data.length == 0);
                        }
                        $scope.totalizarVendedores(response.Data);
                        $scope.state.vendedores.report.carregando = false;
                    },
                    function (error) {
                        $scope.$parent.toastr.error('Ao carregar o gráfico.', 'Comunicação com o servidor');
                        console.error(error);
                        $scope.state.vendedores.report.carregando = false;
                    }
                );
        };

        $scope.totalizarProdutos = function (data) {
            $scope.state.produtos.totais.quantidade = 0;
            $scope.state.produtos.totais.representatividade = 0;

            if (!data)
                return;

            for (var i = 0; i < data.length; i++) {
                $scope.state.produtos.totais.quantidade += data[i].Quantidade;
                $scope.state.produtos.totais.representatividade += data[i].Representatividade;
            }
        }
        $scope.totalizarVendedores = function (data) {
            $scope.state.vendedores.totais.representatividade = 0;

            if (!data)
                return;

            for (var i = 0; i < data.length; i++) {
                $scope.state.vendedores.totais.representatividade += data[i].Representatividade;
            }
        }

        $scope.toggleFilter = function () {
            $scope.state.tickets.filtro.ativo = !$scope.state.tickets.filtro.ativo;
        };
        $scope.clearFilter = function () {
            $scope.state.tickets.filtro = {
                emissao: {
                    de: new Date((new Date()).getFullYear() - 1, 0, 1), //primeiro dia do ano passado
                    ate: null
                },
                codigoTerminal: '',
                periodoFechamento: '',
                codigoVendedor: '',
                ativo: false,
            }
            if ($scope.$parent.config.VisualizaVendasDia) {
                $scope.state.tickets.filtro.emissao.de = new Date((new Date()))
            }

            $scope.refresh();
        };

        $scope.refresh = function () {
            if ($scope.state.tickets.filtro.emissao.de)
            {
                var emissaoDe = $scope.state.tickets.filtro.emissao.de;
                var emissaoDeNoTime = getDateWithoutTime(emissaoDe);
                $scope.state.tickets.filtro.emissao.de = emissaoDeNoTime;
            }

            if ($scope.state.tickets.filtro.emissao.ate)
            {
                var emissaoAte = $scope.state.tickets.filtro.emissao.ate;
                var emissaoAteNoTime = getDateWithoutTime(emissaoAte);
                $scope.state.tickets.filtro.emissao.ate = emissaoAteNoTime;
            }

            $scope.chartTicket();
            $scope.getTop5Produtos();
            $scope.getTop5Vendedores();
        };


        $scope.printPdf = function (showDetails) {
            $timeout(function () {
                window.print();
            }, 2000);
        };

        $scope.initialize();

    }

})();