(function () {
    'use strict';

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

    inconformidades.$inject = ['inconformidadesService', 'FuncionalidadesMapa', 'Mapa', '$routeParams', '$timeout', 'ferramentaExibirClassificacao', 'atalhos',
        'selecionarTrecho', 'ngNotify', '__env'];

    function inconformidades(inconformidadesService, FuncionalidadesMapa, Mapa, $routeParams, $timeout, ferramentaExibirClassificacao, atalhos,
        selecionarTrecho, ngNotify, __env) {

        var directive = {
            restrict: 'E',
            replace: true,
            scope: false,
            templateUrl: __env.appPath + 'scripts/components/inconformidades/inconformidades.directive.html',
            link: link
        };

        function link(scope, element, attr, ctrl) {
            angular.extend(scope.vm, {
                carregarInconformidades: carregarInconformidades,
                marcarTrecho: marcarTrecho,
                toggleSidebarInconformidades: toggleSidebarInconformidades,
                geocodeReverse: geocodeReverse,
                initInconformidades: initInconformidades,
                alterarInconformidade: alterarInconformidade,
                EventClickMapIncoformidades: eventClickMapIncoformidades,
                eventoInconformidades: eventoInconformidades
            });

            let poly = null;
            scope.vm.listaTrechos = [{ Inconforme: true }];
            scope.vm.sidebarInconformidadesOpen = false;
            scope.vm.camposConsultaGeocode = [{ fieldset: '.field-rua', campo: 'Rua' }, { fieldset: '.field-transversal-inicio', campo: 'TransversalInicio' }, { fieldset: '.field-transversal-fim', campo: 'TransversalFim' }];

            carregarInconformidades();

            function toggleSidebarInconformidades(codigoTrecho, trigger) {
                if (trigger === 'polyline') scope.vm.sidebarInconformidadesOpen = true;
                else scope.vm.sidebarInconformidadesOpen = !scope.vm.sidebarInconformidadesOpen;

                element.find('input:text')
                    .blur(() => { atalhos.Habilita(true) })
                    .focus(() => { atalhos.Habilita(false) });

                let trechosContainer = document.getElementsByClassName('lista-trechos-container')[0];
                let listaTrechosHtml = document.getElementsByClassName('item-trecho');
                let trechoSelecionadoHtml;

                for (let item of listaTrechosHtml) {
                    if (parseInt(item.dataset.trecho) === codigoTrecho) {
                        trechoSelecionadoHtml = item;
                    }
                }

                if (trechosContainer && trechoSelecionadoHtml)
                    trechosContainer.scrollTop = trechoSelecionadoHtml.offsetTop - trechosContainer.offsetTop;

                setTimeout(() => Mapa.Resize(), 300);
            }

            function initInconformidades(polyline) {
                ferramentaExibirClassificacao.SetEventoInconformidades(eventoInconformidades);
                poly = polyline;
                google.maps.event.clearListeners(poly, 'click');
                google.maps.event.addListener(poly, 'click', event => eventoInconformidades(event));
                selecionarTrecho.SetScope(scope);
                ferramentaExibirClassificacao.SetScope(scope);
                selecionarTrecho.SetEventoInconformidades(eventoInconformidades);
            }

            function marcarTrecho(trecho) {

                scope.vm.trechoAtivo = trecho;

                removerConsultaGeocode();

                if (poly.map) {

                    var index = poly.getPath().getArray().findIndex(item => item.CodigoTrecho == trecho.Codigo);
                    var ponto = poly.getPath().getAt(index);
                    FuncionalidadesMapa.MostrarSelecionarTrecho({ latLng: ponto }, poly);
                    FuncionalidadesMapa.GetPolylineHighlight().setOptions({ strokeColor: ferramentaExibirClassificacao.GetColorPolyline(trecho.Codigo) });
                    FuncionalidadesMapa.AtualizarCorPolyline(FuncionalidadesMapa.GetPolylineHighlight(), ferramentaExibirClassificacao.GetColorPolyline(trecho));

                    var bounds = new google.maps.LatLngBounds();
                    FuncionalidadesMapa.GetPolylineHighlight().getPath().getArray().forEach(c => bounds.extend(c));
                    Mapa.map.fitBounds(bounds);
                    Mapa.map.setZoom(Mapa.map.getZoom() - 2);
                }
            }

            function removerConsultaGeocode(removeBlur = true) {

                scope.Habilitado = false;
                scope.vm.estaConsultandoLatLng = false;

                if (removeBlur)
                    $('.field-geocode').removeClass('active').find('.campo-endereco').blur();
                 else
                    $('.field-geocode').removeClass('active');

                google.maps.event.clearListeners(Mapa.map, 'click');
            }

            function carregarInconformidades() {
                inconformidadesService.CarregarInconformidades({
                    CodigoRota: $routeParams.CodigoRota,
                    RotasTemp: $routeParams.rt
                })
                    .then(successCarregarInconformidades)
                    .catch(errorRequest);
            }

            function geocodeReverse(index) {

                var campo = scope.vm.camposConsultaGeocode[index].campo;
                var fieldset = scope.vm.camposConsultaGeocode[index].fieldset;

                scope.vm.campoAtivo = campo;

                google.maps.event.clearListeners(Mapa.map, 'click');

                if ($(fieldset).hasClass('active')) {

                    scope.setCursor('cursor-pointer');
                    scope.vm.estaConsultandoLatLng = false;

                    $(fieldset).removeClass('active');
                    scope.Habilitado = false;
                } else {

                    scope.setCursor('cursor-geocode');

                    scope.vm.estaConsultandoLatLng = true;
                    google.maps.event.addListener(Mapa.map, 'click', eventClickMapIncoformidades);

                    if (scope.vm.trechoAtivo)
                        $('.field-geocode').removeClass('active');

                    $(fieldset).addClass('active');
                    $(fieldset).find('.campo-endereco').focus();
                    scope.Habilitado = true;
                }
            }

            function eventClickMapIncoformidades(e) {
                if (scope.Habilitado) {
                    FuncionalidadesMapa.GetAddress(e.latLng, scope.vm.usarGeoGoogle, endereco => {

                        removerConsultaGeocode();
                        scope.vm.trechoAtivo[scope.vm.campoAtivo] = endereco;
                        alterarInconformidade();

                        if (!scope.vm.trechoAtivo[scope.vm.camposConsultaGeocode[0].campo])
                            geocodeReverse(0);
                        else if (!scope.vm.trechoAtivo[scope.vm.camposConsultaGeocode[1].campo])
                            geocodeReverse(1);
                        else if (!scope.vm.trechoAtivo[scope.vm.camposConsultaGeocode[2].campo])
                            geocodeReverse(2);
                        else scope.setCursor('cursor-pointer');

                        // scope.$apply();
                    }, error => console.error(error));
                }
            }

            function successCarregarInconformidades(result) {
                scope.vm.listaTrechos = result.data;
                //marcarTrecho(result.data[0]);
                scope.vm.trechoAtivo = result.data[0];
                scope.vm.inconformidades = [];

                scope.vm.listaTrechos.forEach((item) => {
                    if (item.Inconforme) scope.vm.inconformidades.push(item);

                    item.RotasHorariosInconformidades = {
                        seg: { DiaSemana: 1, Check: false, Hora: "" },
                        ter: { DiaSemana: 2, Check: false, Hora: "" },
                        qua: { DiaSemana: 3, Check: false, Hora: "" },
                        qui: { DiaSemana: 4, Check: false, Hora: "" },
                        sex: { DiaSemana: 5, Check: false, Hora: "" },
                        sab: { DiaSemana: 6, Check: false, Hora: "" },
                        dom: { DiaSemana: 0, Check: false, Hora: "" }
                    };

                    for (let prop in item.RotasHorariosInconformidades) {
                        if (item.RotasHorariosInconformidades.hasOwnProperty(prop)) {
                            let value = item.RotaHorarios.find((itemData) => {
                                return item.RotasHorariosInconformidades[prop].DiaSemana === itemData.DiaSemana;
                            });

                            if (value) {
                                item.RotasHorariosInconformidades[prop].Hora = value.HoraMinuto;
                                item.RotasHorariosInconformidades[prop].Check = true;
                            }
                        }
                    }
                });

                if (scope.vm.showInconformidades) {
                    if (scope.vm.inconformidades.length === 1)
                        ngNotify.set(`Foi encontrada ${scope.vm.inconformidades.length} inconformidade no Geocode`, {
                            type: 'warn',
                            sticky: false,
                            button: true
                        });
                    else if (scope.vm.inconformidades.length > 1)
                        ngNotify.set(`Foram encontradas ${scope.vm.inconformidades.length} inconformidades no Geocode`, {
                            type: 'warn',
                            sticky: false,
                            button: true
                        });
                } else scope.vm.showInconformidades = true;
            }

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

            function eventoInconformidades(event, indexPolyline) {
                let index = indexPolyline;
                if (!indexPolyline) {
                    if (event.latLng) index = poly.IndexPoint(event.latLng);
                    else index = poly.IndexPoint(new google.maps.LatLng(event.lat(), event.lng()));
                }

                index++;
                let codigoTrecho = poly.getPath().getArray()[index].CodigoTrecho;
                scope.vm.trechoAtivo = scope.vm.listaTrechos.find(item => item.Codigo == codigoTrecho);

                if (scope.vm.trechoAtivo) {
                    scope.vm.trechoAtivo.Alterado = true;


                    toggleSidebarInconformidades(codigoTrecho, 'polyline');
                    // google.maps.event.clearListeners(FuncionalidadesMapa.GetPolylineHighlight(), 'click');
                    // google.maps.event.addListener(FuncionalidadesMapa.GetPolylineHighlight(), 'click', event => eventoInconformidades(event.latLng));

                    if (!scope.$$phase)
                        scope.$apply();
                }
            }

            function alterarInconformidade() {
                removerConsultaGeocode(false);
                scope.setCursor('cursor-pointer');
                scope.vm.trechoAtivo.Alterado = true;
                scope.vm.RotaObservable.notify('enable');

                scope.vm.trechoAtivo.Ajustado = !!(scope.vm.trechoAtivo.Rua && scope.vm.trechoAtivo.TransversalInicio && scope.vm.trechoAtivo.TransversalFim);
            }
        }

        return directive;
    }
})();
