(function () {
    'use strict';

    angular
        .module('editorRotas')
        .factory('ferramentaExibirClassificacao', ferramentaExibirClassificacao);

    ferramentaExibirClassificacao.$inject = ['FuncionalidadesMapa', 'Mapa'];

    function ferramentaExibirClassificacao(FuncionalidadesMapa, Mapa) {
        var map = null;
        var polylines = [];
        var polylinePrincipal = null;
        var _addListener = null;
        var _scope = null;

        function selecaoPolylineClassificada(polyline, addListener) {
            map = Mapa.map;
            polylinePrincipal = polyline;
            _addListener = addListener;

            var poly = polyline.getPath().getArray();
            for (var i = 1; i < poly.length; i++) {
                var coordinates = [];
                coordinates.push(poly[i - 1]);
                coordinates.push(poly[i]);

                switch (poly[i].Tipo) {
                    case 'DS': addPolyline(coordinates, '#059cc7'); break;
                    case 'DM': addPolyline(coordinates, '#a3d06d'); break;
                    case 'DN': addPolyline(coordinates, '#ff665a'); break;
                }
            }
            FuncionalidadesMapa.SetPolylineClassificarTrecho(polylines);
        }

        function addPolyline(points, color) {
            var polyline = new google.maps.Polyline({
                strokeColor: color,
                path: points,
                zIndex: 999,
                strokeWeight: 3,
                editable: false,
                map: null,
            });
            polyline.setMap(map);
            polylines.push(polyline);

            if (!_addListener && (location.href.indexOf("Etapa") > -1 && location.href.indexOf("Etapa3") == -1))
                google.maps.event.addListener(polyline, 'click', (event) => {
                    if (!_scope.vm.estaConsultandoLatLng) {
                        FuncionalidadesMapa.MostrarSelecionarTrecho(event, polylinePrincipal);
                        EventoInconformidades(event);
                        FuncionalidadesMapa.AtualizarCorPolyline(FuncionalidadesMapa.GetPolylineHighlight(), polyline.strokeColor);
                    }else{
                        _scope.vm.EventClickMapIncoformidades(event);
                    }
                });
        }

        function remover() {
            polylines.forEach(poly => poly.setMap(null));
            polylines = [];
        }

        function getColorPolyline(codigoTrecho) {
            var color = null;

            polylines.forEach(polyline => {
                polyline.getPath().getArray().forEach(ponto => {
                    if (ponto.CodigoTrecho === codigoTrecho && !color)
                        color = polyline.strokeColor;
                });
            });

            return color;
        }

        function EventoInconformidades() { }

        function GetPolylinesClassificadas() {
            return polylines;
        }

        return {
            SelecaoPolylineClassificada: selecaoPolylineClassificada,
            Esconder: () => polylines.forEach(poly => poly.setMap(null)),
            Mostrar: () => polylines.forEach(poly => poly.setMap(map)),
            GetPolylinesClassificadas: () => polylines,
            RemoverTodas: remover,
            GetColorPolyline: getColorPolyline,
            SetEventoInconformidades: (evento) => EventoInconformidades = evento,
            SetScope: (scope) => { _scope = scope }
        }
    }
})();
