(function () {
    'use strict';
    angular
        .module('controleApp')
        .controller('editarconfigController', editarconfigController);

    editarconfigController.$inject = ['$scope', 'Consulta', 'Comando', '$location', '$routeParams'];

    function editarconfigController($scope, Consulta, Comando, $location, $routeParams) {
        /*jshint validthis:true*/
        let vm = this;

        angular.extend(this, {
            changeValue: () => this.visible = true,
            removeMacro: (index) => vm.listaMacros.splice(index, 1),
            addMacro: addMacro
        });

        vm.toggleModal = {};
        vm.accordion = {};
        vm.notificationMessages = {};
        vm.aplicacoes = [];
        vm.operacoes = [];
        vm.macros = [];
        vm.listaMacros = [];
        let padraoListaMacros = {};
        let confirm;

        function addMacro() {
            padraoListaMacros.Codigo++;
            let novo = Object.assign({}, padraoListaMacros);
            vm.listaMacros.push(novo);
        }

        $scope.CodigoConfiguracao = $routeParams.id;
        $scope.RedirecionarListaConfiguracoes = RedirecionarListaConfiguracoes;
        $scope.EditarConfiguracao = EditarConfiguracao;
        $scope.CarregarMacrosEdicao = CarregarMacrosEdicao;
        $scope.CarregarListaMacrosEdicao = CarregarListaMacrosEdicao;

        function RedirecionarListaConfiguracoes() {
            $location.path('/Controle' + $scope.editarconfigCtrl.toggleModal.redirectMensagem);
            confirm = true;
        }

        $scope.$on('$locationChangeStart', (event, next, current) => {
            if (next != current && !confirm) {
                $scope.editarconfigCtrl.toggleModal.sairSemSalvarConfiguracao(next.split('Controle')[1]);
                event.preventDefault();
            }
            confirm = false;
        });

        $('.loading-div').fadeIn();
        Consulta.CarregarCodigoAplicacao((result) => {
            $scope.CodigoANTT = result.data;
        }, (error) => {
            console.log('Erro ao carregar codigo ANTT');
            console.log(error.statusText);
        });

        function init() {
            $('.loading-div').fadeIn();
            carregarHistoricoEdicao();
            carregarAplicacoesEdicao();
        }

        function carregarHistoricoEdicao() {
            Consulta.CarregarHistorico($scope.CodigoConfiguracao, result => {
                if (result && result.data && result.data.length > 0) {
                    $scope.Historico = result.data;
                } else {
                    $scope.showWarning('A consulta não retornou histórico.');
                }
            }, error => $scope.showError(error.statusText));
        }

        function carregarAplicacoesEdicao() {
            Consulta.CarregarAplicacoes(result => {
                if (result && result.data && result.data.length > 0) {
                    vm.aplicacoes = result.data;
                } else {
                    $scope.showWarning('A consulta não retornou aplicaçõees.');
                }
                carregarConfiguracaoEdicaoAplicacao();
            }, error => {
                $scope.showError(error.statusText);
                $('.loading-div').fadeOut();
            });
        }

        function carregarConfiguracaoEdicaoAplicacao() {
            Consulta.CarregarConfiguracaoEdicao($scope.CodigoConfiguracao, result => {
                if (result && result.data) {
                    let macro = result.data.CodigoMacro;
                    vm.configAplicacoes = result.data.ConfigAplicacao;
                    $scope.selectAplicacao = result.data.CodigoAppInicial;
                    $scope.selectOperacaoEdicao = result.data.CodigoOperacao;
                    let listaMacros = result.data.ListaMacros;

                    carregarOperacoesEdicao(result.data.CodigoOperacao, macro, listaMacros);

                } else {
                    $scope.showWarning('A consulta não retornou aplicações.');
                }
            }, error => {
                $scope.showError(error.statusText);
                $('.loading-div').fadeOut();
            });
        }

        function carregarOperacoesEdicao(codigoOperacao, macro, listaMacros) {
            Consulta.CarregarOperacoes(codigoOperacao, result => {
                if (result && result.data && result.data.length > 0) {
                    vm.operacoes = result.data;
                    carregarMacrosEdicaoOperacao(macro, listaMacros);
                } else {
                    $scope.showWarning('A consulta não retornou operações.');
                }
            }, error => {
                $scope.showError(error.statusText);
                $('.loading-div').fadeOut();
            });
        }

        function carregarMacrosEdicaoOperacao(macro, listaMacros) {
            Consulta.CarregarMacros($scope.selectOperacaoEdicao, result => {
                vm.macros = result.data;
                $scope.selectMacro = macro;

                if ($scope.selectMacro)
                    carregarListaMacrosEdicaoOperacao(listaMacros);
                else
                    $('.loading-div').fadeOut();
            }, error => $scope.showError(error.statusText));
        }

        function carregarListaMacrosEdicaoOperacao(listaMacros) {
            Consulta.CarregarListaMacros($scope.selectMacro, result => {
                result.data.Codigo = 0;
                padraoListaMacros = Object.assign({}, result.data);
                vm.listaMacros.push(result.data);
                selecionarListaMacros(listaMacros);
                $('.loading-div').fadeOut();
            }, error => {
                $scope.showError(error.statusText);
                $('.loading-div').fadeOut();
            });
        }

        function CarregarMacrosEdicao() {
            $('.loading-div').fadeIn();
            Consulta.CarregarMacros($scope.selectOperacaoEdicao, result => {
                if (result && result.data && result.data.length > 0) {
                    $scope.hideAll();
                    vm.macros = result.data;
                } else {
                    vm.macros = [];
                    $scope.showWarning('A consulta não retornou macros.');
                }
                $('.loading-div').fadeOut();
            }, error => {
                vm.macros = [];
                $scope.showError(error.statusText);
                $('.loading-div').fadeOut();
            });
        }

        function CarregarListaMacrosEdicao() {
            if ($scope.selectMacro) {
                $('.loading-div').fadeIn();

                Consulta.CarregarListaMacros($scope.selectMacro, result => {
                    if (result && result.data) {
                        result.data.Codigo = 0;

                        padraoListaMacros = Object.assign({}, result.data);
                        vm.listaMacros.push(result.data);
                    } else {
                        vm.listaMacros = [];
                        $scope.showWarning('A consulta não retornou dados.');
                    }
                    $('.loading-div').fadeOut();
                }, error => {
                    vm.listaMacros = [];
                    $scope.showError(error.statusText);
                    $('.loading-div').fadeOut();
                });
            } else {
                vm.listaMacros = [];
            }
        }

        function selecionarListaMacros(listaMacros) {
            listaMacros.forEach((value, key) => {
                if (key === 0) {
                    vm.listaMacros[key].Codigo = 0;
                    vm.listaMacros[key].MacroSelecionada = value.MacroSelecionada;
                    vm.listaMacros[key].TabelaSelecionada = value.TabelaSelecionada;
                } else {
                    padraoListaMacros.Codigo++;

                    let novo = Object.assign({}, padraoListaMacros);
                    novo.MacroSelecionada = value.MacroSelecionada;
                    novo.TabelaSelecionada = value.TabelaSelecionada;

                    vm.listaMacros.push(novo);
                }
            });
        }

        function EditarConfiguracao() {
            let appSelecionado = false;

            vm.configAplicacoes.forEach(value => {
                if (value.Checked) {
                    appSelecionado = true;
                }
            });

            let listaMacros = angular.copy(vm.listaMacros);

            listaMacros.forEach(value => {
                value.CamposMacro = null;
                value.TabelasVerticais = null;
            });

            if ($scope.selectAplicacao && $scope.selectOperacaoEdicao && appSelecionado) {
                let obj = {
                    Codigo: $scope.CodigoConfiguracao,
                    CodigoOperacao: $scope.selectOperacaoEdicao,
                    CodigoMacro: $scope.selectMacro,
                    CodigoAppInicial: $scope.selectAplicacao,
                    ConfigAplicacao: vm.configAplicacoes,
                    ListaMacros: listaMacros
                };
                $('.loading-div').fadeIn();

                vm.configAplicacoes.forEach(value => value.TempoDescanso = '00:' + value.TempoDescansoFormatado);

                Comando.SalvarConfiguracao(obj, result => {
                    if (result.data.IsSucesso) {
                        localStorage.setItem('MensagemSucesso', result.data.Mensagem);

                        confirm = true;
                        $location.path('/Controle/Configuracoes');
                    } else {
                        $scope.showError(result.data.MensagemErro);
                    }

                    $('.loading-div').fadeOut();
                }, error => {
                    $scope.showError(error.statusText);
                    $('.loading-div').fadeOut();
                });
            } else {
                $scope.showError('Existem campos obrigatórios não preenchidos, por favor, preencha todos os campos obrigatórios!');
            }
        }

        init();
    }
})();
