class AlarmeContextoHistorico {
    conteudoMarker = null;

    constructor() { }

    ProcessarDados(data) {
        const pts = [];
        const ptsMenores = [];
        const ptsMaiores = [];
        const infowindows = [];

        for (let y in data.Menores) {
            const ponto = [data.Menores[y].Ponto.Latitude, data.Menores[y].Ponto.Longitude];
            infowindows.push(this.MontarInfoWindowNavegacao(data.Menores[y]));
            ptsMenores.push(ponto);
            pts.push(ponto);
        }

        for (let x in data.Maiores) {
            const ponto = [data.Maiores[x].Ponto.Latitude, data.Maiores[x].Ponto.Longitude];
            infowindows.push(this.MontarInfoWindowNavegacao(data.Maiores[x]));
            ptsMaiores.push(ponto);
            pts.push(ponto);
        }

        if (ptsMaiores[0] != null) {
            ptsMenores.push(ptsMaiores[0]);
        }

        const optionsMaiores = new InlogMaps.PolylineOptions(ptsMaiores, true, false, false, false, '#FF00FF', 10);
        optionsMaiores.opacity = 0.4;
        optionsMaiores.zIndex = 3;
        vm.currentMap.drawPolyline('polylineMaiores', optionsMaiores);

        const optionsMenores = new InlogMaps.PolylineOptions(ptsMenores, true, false, false, false, '#00FF00', 10);
        optionsMenores.opacity = 0.4;
        optionsMenores.zIndex = 4;
        vm.currentMap.drawPolyline('polylineMenores', optionsMenores);

        this.DrawHistoryPolyline(pts, infowindows);
        this.DrawMarker(data);
    }

    DrawHistoryPolyline(pts, infowindows) {
        const options = new InlogMaps.PolylineOptions(pts, true, true, false, false, '#FF0000', 2);
        options.opacity = 0.75;
        options.zIndex = 5;
        options.infowindows = infowindows;
        options.navigateOptions = new InlogMaps.NavigationOptions('#000000', 5, false);
        vm.currentMap.drawPolylineWithNavigation('polylineTrecho', options);
    }

    MontarInfoWindowNavegacao(point) {
        const infowindow = point.InfoWindow;
        let unidade = 'm';
        let duracao = '{0}h{1}m{2}s';
        let distancia = point.Trecho ? point.Trecho.Distancia : 0;
        let tempo = point.Trecho ? point.Trecho.Duracao : 0;

        if (isNaN(distancia)) {
            distancia = 0;
        } else if (distancia > 1000) {
            distancia = distancia / 1000;
            unidade = 'km/h';
        }

        if (!isNaN(tempo)) {
            let dt = new Date(0, 0, 0, 0, 0, 0, tempo);
            duracao = dt.getSeconds() + 's';

            if (dt.getMinutes() >= 1) {
                duracao = dt.getMinutes() + 'm' + duracao;
            }

            if (dt.getHours() >= 1) {
                duracao = dt.getHours() + 'h' + duracao;
            }

        } else duracao = '0s';

        let content = $('#inf-alarme-generico')[0].innerHTML
            .replace(/{distancia}/, this.RoundNumber(distancia, 2))
            .replace(/{distanciaUnidade}/, unidade)
            .replace(/{duracao}/, duracao)
            .replace(/{dataHora}/, infowindow.DataHora)
            .replace(/{velocidade}/, infowindow.Velocidade);

        return content;
    }

    LimparContextoAlarmeMapa() {
        vm.currentMap.removePolylineHighlight();
        vm.currentMap.closePopup('alarme');
        vm.currentMap.removePolylines('polylineTrecho');
        vm.currentMap.removePolylines('polylineMenores');
        vm.currentMap.removePolylines('polylineMaiores');
        vm.currentMap.removeMarkers('alarme');

        if (this.conteudoMarker) {
            this.conteudoMarker = null;
        }
    }

    DrawMarker(data) {
        const template = $('#inf-alarme-marker')[0].innerHTML;
        this.conteudoMarker = template.replace('{Descricao}', data.Descricao)
            .replace('{Data}', data.DataHora)
            .replace('{Info}', data.InformacoesAdicionais);

        const pt = [data.Latitude, data.Longitude];
        const options = new InlogMaps.MarkerOptions(pt, true);
        vm.currentMap.drawMarker('alarme', options, this.ClickMarker.bind(this));
    }

    ClickMarker() {
        vm.currentMap.removePolylineHighlight();
        const popopOptions = new InlogMaps.PopupOptions();
        popopOptions.content = this.conteudoMarker;
        popopOptions.marker = 'alarme';
        vm.currentMap.drawPopup('alarme', popopOptions);
    }

    RoundNumber = (original, decimais) => {
        decimais = 10 * decimais;
        return Math.round(original * decimais) / decimais;
    }
}