(function () {
    'use strict';

    angular.module('editorRotas')
        .directive('popoverRotasSetor', popoverRotasSetor);

    popoverRotasSetor.$inject = ['__env', 'FormValidation', 'rotasService', '$timeout', '$routeParams', 'ngNotify'];

    function popoverRotasSetor(__env, FormValidation, rotasService, $timeout, $routeParams, ngNotify) {
        let directive = {
            restrict: 'E',
            replace: true,
            templateUrl: __env.appPath + 'scripts/components/popover-rotas-setor/popover-rotas-setor.directive.html',
            link: link
        };

        // Todo: implementar mensagens de erro por campo á partir do servidor
        //vm.validationFormName.setFormErrors(result.meta.Errors);
        function link(scope, element, attr, ctrl) {

            angular.extend(scope.vm, {
                togglePopoverRotasSetor: togglePopoverRotasSetor,
                abrirModalCriarRotaManualmente: abrirModalCriarRota,
                fecharModalCriarRotaManualmente: fecharModalCriarRota,
                abrirModalDuplicaRota: abrirModalDuplicaRota,
                fecharModalDuplicarRota: fecharModalDuplicarRota,
                abrirModalRenomearRota: abrirModalRenomearRota,
                fecharModalRenomearRota: fecharModalRenomearRota,
                abrirModalExcluirRota: abrirModalExcluirRota,
                fecharModalExcluirRota: fecharModalExcluirRota,
                criarRota: criarRota,
                duplicarRota: duplicarRota,
                renomearRota: renomearRota,
                excluirRota: excluirRota,
                carregarSetorSelecionado: carregarSetorSelecionado
            });

            scope.vm.StatusEnum = ["Ativa", "Completa", "Incompleta", "Sem Rota", "Inativa"];

            function togglePopoverRotasSetor() {
                element.toggleClass('active');
                $('.lista-rotas').slimScroll({
                    allowPageScroll: false,
                    color: '#ababab',
                    disableFadeOut: false,
                    size: '10px',
                    start: 'top',
                    wheelStep: 10,
                    scrollBy: '60px'
                });
                $('.lista-rotas').css('height', "");
                $('.lista-rotas').css('max-height', "650px");
                $('.slimScrollDiv').css('height', "");
                $('.slimScrollDiv').css('max-height', "650px");
            }

            function carregarSetorSelecionado(rota) {
                if (rota.CodigoSetor !== parseInt($routeParams.CodigoSetor) || rota.Codigo !== parseInt($routeParams.CodigoRota))
                    $timeout(() => window.location.href = urlGlobal + "EditorRotas/Etapa" + etapas(rota) + "/?CodigoSetor="
                        + rota.CodigoSetor + "&CodigoRota=" + rota.Codigo + "&rt=" + rota.RotasTemp, 2000);
            }

            function etapas(rota) {
                switch (rota.Estado) {
                    case 'I':
                        return '3';
                    case 'G':
                    case 'S':
                        return '2';
                    case 'T':
                        return '1';
                    default:
                }
            }

            //////////////////////////////////////////////////
            function abrirModalCriarRota(rota) {
                scope.vm.novaRota = Object.assign({}, rota);

                scope.vm.openModal('Nova Rota', __env.appPath + 'scripts/partials/nova-rota.partial.html', fecharModalCriarRota)
                    .then(function () {
                        scope.vm.validationFormCriarRota = new FormValidation(scope.vm.formCriarRotaManualmente);
                        scope.vm.validationFormCriarRota.setControlsValidation();
                        scope.vm.modalOpen = true;
                    })
                    .catch(errorRequest);
            }

            function fecharModalCriarRota() {
                scope.vm.modalOpen = false;
                scope.vm.closeModal()
                    .then(function () {
                        scope.vm.validationFormCriarRota.resetControlsValidation();
                        scope.vm.novaRota = {};
                    })
                    .catch(errorRequest)
            }

            function criarRota() {
                scope.vm.setFormStatus(scope.vm.formCriarRotaManualmente, 'SENDING').then(function () {
                    let obj = {
                        CodigoSetor: $routeParams.CodigoSetor,
                        Apelido: scope.vm.novaRota.Apelido,
                        Descricao: scope.vm.novaRota.Descricao,
                        RotasTemp: true
                    };

                    rotasService.CriarRota(obj).then(successCriarRota).catch(errorCriarRota);
                });
            }

            function successCriarRota(result) {
                if (result.data.Sucesso) {
                    scope.vm.setFormStatus(scope.vm.formCriarRotaManualmente, 'SEND_SUCCESS').then(function () {
                        ngNotify.set(result.data.MensagemSucesso, { type: 'success', sticky: false });
                        fecharModalCriarRota();
                        scope.vm.rotasSetor.push(result.data.Objeto);
                        carregarSetorSelecionado(result.data.Objeto);
                    });
                } else {
                    scope.vm.setFormStatus(scope.vm.formCriarRotaManualmente, 'SEND_FAIL').then(function () {
                        ngNotify.set(result.data.MensagemErro, { target: '#modalNotificationOuter', type: 'error', sticky: true, button: true });
                        $timeout(() => { scope.vm.setFormStatus(scope.vm.formCriarRotaManualmente, null); }, 1000);
                    });
                }
            }

            function errorCriarRota(error) {
                scope.vm.setFormStatus(scope.vm.formCriarRotaManualmente, 'SEND_FAIL').then(function () {
                    fecharModalCriarRota();
                    ngNotify.set(error.statusText, { type: 'error', sticky: true, button: true });
                });
            }

            //////////////////////////////////////////////////
            function abrirModalDuplicaRota(rota) {
                scope.vm.rotaDuplicar = Object.assign({}, rota);

                scope.vm.openModal('Duplicar Rota', __env.appPath + 'scripts/partials/duplicar-rota.partial.html', fecharModalDuplicarRota)
                    .then(function () {
                        scope.vm.validationFormDuplicarRota = new FormValidation(scope.vm.formDuplicarRota);
                        scope.vm.validationFormDuplicarRota.setControlsValidation();
                        scope.vm.modalOpen = true;
                    })
                    .catch(errorRequest);
            }

            function fecharModalDuplicarRota() {
                scope.vm.modalOpen = false;
                scope.vm.closeModal()
                    .then(function () {
                        scope.vm.validationFormDuplicarRota.resetControlsValidation();
                        scope.vm.rotaDuplicar = {};
                    })
                    .catch(errorRequest)
            }

            function duplicarRota() {
                scope.vm.setFormStatus(scope.vm.formDuplicarRota, 'SENDING').then(function () {
                    let obj = {
                        CodigoRotaDuplicada: scope.vm.rotaDuplicar.Codigo,
                        RotasTemp: scope.vm.rotaDuplicar.RotasTemp,
                        Descricao: scope.vm.rotaDuplicar.Descricao,
                        Apelido: scope.vm.rotaDuplicar.Apelido,
                        CodigoSetor: scope.vm.rotaDuplicar.CodigoSetor
                    };

                    rotasService.DuplicarRota(obj).then(successDuplicarRota).catch(errorDuplicarRota);
                });
            }

            function successDuplicarRota(result) {
                if (result.data.Sucesso) {
                    scope.vm.setFormStatus(scope.vm.formDuplicarRota, 'SEND_SUCCESS').then(function () {
                        ngNotify.set(result.data.MensagemSucesso, { type: 'success', sticky: false });
                        fecharModalDuplicarRota();
                        scope.vm.rotasSetor.push(result.data.Objeto);
                        carregarSetorSelecionado(result.data.Objeto);
                    });
                } else {
                    scope.vm.setFormStatus(scope.vm.formDuplicarRota, 'SEND_FAIL').then(function () {
                        ngNotify.set(result.data.MensagemErro, { target: '#modalNotificationOuter', type: 'error', sticky: true, button: true });
                        $timeout(() => { scope.vm.setFormStatus(scope.vm.formDuplicarRota, null); }, 1000);
                    });
                }
            }

            function errorDuplicarRota(error) {
                scope.vm.setFormStatus(scope.vm.formDuplicarRota, 'SEND_FAIL').then(function () {
                    fecharModalDuplicarRota();
                    ngNotify.set(error.statusText, { type: 'error', sticky: true, button: true });
                });
            }

            //////////////////////////////////////////////////
            function abrirModalRenomearRota(rota) {
                scope.vm.rotaRenomear = Object.assign({}, rota);

                scope.vm.openModal('Renomear Rota', __env.appPath + 'scripts/partials/renomear-rota.partial.html', fecharModalRenomearRota)
                    .then(function () {
                        scope.vm.validationFormRenomearRota = new FormValidation(scope.vm.formRenomearRota);
                        scope.vm.validationFormRenomearRota.setControlsValidation();
                        scope.vm.modalOpen = true;
                    })
                    .catch(errorRequest);
            }

            function fecharModalRenomearRota() {
                scope.vm.modalOpen = false;
                scope.vm.closeModal()
                    .then(function () {
                        scope.vm.validationFormRenomearRota.resetControlsValidation();
                        scope.vm.rotaRenomear = {};
                    })
                    .catch(errorRequest)
            }

            function renomearRota() {
                scope.vm.setFormStatus(scope.vm.formRenomearRota, 'SENDING').then(function () {
                    rotasService.RenomearRota(scope.vm.rotaRenomear)
                        .then(successRenomearRota)
                        .catch(errorRenomearRota);
                });
            }

            function successRenomearRota(result) {
                if (result.data.Sucesso) {
                    scope.vm.setFormStatus(scope.vm.formRenomearRota, 'SEND_SUCCESS').then(function () {
                        ngNotify.set(result.data.MensagemSucesso, { type: 'success', sticky: false });
                        fecharModalRenomearRota();
                        scope.vm.informacoesRotaAtual.DescricaoRota = scope.vm.rotaRenomear.Descricao;
                        scope.vm.rotasSetor.forEach(function (item) {
                            if (item.Codigo === scope.vm.rotaRenomear.Codigo) {
                                item.Descricao = scope.vm.rotaRenomear.Descricao;
                                item.Apelido = scope.vm.rotaRenomear.Apelido;
                            }
                        });
                    });
                } else {
                    scope.vm.setFormStatus(scope.vm.formRenomearRota, 'SEND_FAIL').then(function () {
                        ngNotify.set(result.data.MensagemErro, { target: '#modalNotificationOuter', type: 'error', sticky: true, button: true });
                        $timeout(() => { scope.vm.setFormStatus(scope.vm.formRenomearRota, null); }, 1000);
                    });
                }
            }

            function errorRenomearRota(error) {
                scope.vm.setFormStatus(scope.vm.formRenomearRota, 'SEND_FAIL').then(function () {
                    fecharModalRenomearRota();
                    ngNotify.set(error.statusText, { type: 'error', sticky: true, button: true });
                });
            }

            //////////////////////////////////////////////////
            function abrirModalExcluirRota(rota) {
                scope.vm.rotaExcluir = Object.assign({}, rota);

                scope.vm.openModal('Confirmar Exclusão da Rota', __env.appPath + 'scripts/partials/confirmar-exclusao.partial.html', fecharModalExcluirRota)
                    .then(function () {
                        scope.vm.validationFormExcluirRota = new FormValidation(scope.vm.formExcluirRota);
                        scope.vm.validationFormExcluirRota.setControlsValidation();
                        scope.vm.modalOpen = true;
                    })
                    .catch(errorRequest);
            }

            function fecharModalExcluirRota() {
                scope.vm.modalOpen = false;
                scope.vm.closeModal()
                    .then(function () {
                        scope.vm.validationFormExcluirRota.resetControlsValidation();
                        scope.vm.rotaExcluir = {};
                    })
                    .catch(errorRequest)
            }

            function excluirRota() {
                scope.vm.setFormStatus(scope.vm.formExcluirRota, 'SENDING').then(function () {
                    if (scope.vm.rotaExcluir.Status === 1 || scope.vm.rotaExcluir.Status === 2 || scope.vm.rotaExcluir.Status === 4) {
                        let obj = {
                            codigoSetorRota: scope.vm.rotaExcluir.Codigo,
                            rotasTemp: scope.vm.rotaExcluir.RotasTemp
                        };

                        rotasService.ExcluirRota(obj).then(successExcluirRota).catch(errorExcluirRota);
                    }
                });
            }

            function successExcluirRota(result) {
                if (result.data.Sucesso) {
                    scope.vm.setFormStatus(scope.vm.formExcluirRota, 'SEND_SUCCESS').then(function () {
                        fecharModalExcluirRota();
                        ngNotify.set(result.data.MensagemSucesso, { type: 'success', sticky: false });
                        scope.vm.rotasSetor.splice(scope.vm.rotasSetor.indexOf(scope.vm.rotasSetor.filter((item) => item.Codigo === scope.vm.rotaExcluir.Codigo)[0]), 1);
                    });
                } else {
                    scope.vm.setFormStatus(scope.vm.formExcluirRota, 'SEND_FAIL').then(function () {
                        ngNotify.set(result.data.MensagemErro, { target: '#modalNotificationOuter', type: 'error', sticky: true, button: true });
                        $timeout(() => { scope.vm.setFormStatus(scope.vm.formExcluirRota, null); }, 1000);
                    });
                }

                if (parseInt($routeParams.CodigoRota) === parseInt(scope.vm.rotaExcluir.Codigo)) {
                    $timeout(function () {
                        window.onbeforeunload = null;
                        window.location.href = urlGlobal + 'EditorRotas';
                    }, 2000);
                }
            }

            function errorExcluirRota(error) {
                scope.vm.setFormStatus(scope.vm.formExcluirRota, 'SEND_FAIL').then(function () {
                    fecharModalExcluirRota();
                    ngNotify.set(error.statusText, { type: 'error', sticky: true, button: true });
                });
            }

            ///////////////////////////////////////////////
            function errorRequest(error) {
                if (error.statusText) ngNotify.set(error.statusText, { type: 'error', sticky: true, button: true });
                console.error(error);
            }
        }

        return directive;
    }

})();
