let listaRotasSalvas = ko.observableArray();
let rotaOrigem = ko.observable();
let rotaDestino = ko.observable();
let tempoDeslocamento = ko.observable();

const InfoUsuario = getUserInfo(); 
const RoutesService = window.__env.InlogRouteservice;
const RoutesUrl = window.__env.InlogRoutesApiUrl + `/api/Route/${RoutesService}/GetRoute`;
const RoutesToken = window.btoa(`${window.__env.InlogRoutesPassword};${window.__env.InlogRoutesUsuario};${InfoUsuario.empresa}`);


function ViewModel(usarGoogleGeoCode, chaveMapa, DadosAvaliarTroca) {
    const mSelf = this;
    mSelf.DadosTerminalTroca = ko.observableArray(DadosAvaliarTroca.DadosTerminalTroca);
    mSelf.TituloLinha = ko.observable(DadosAvaliarTroca.TituloLinha);
    mSelf.currentMap = new InlogMaps.Map;

    let params = {};
    let mapType = "";

    if (usarGoogleGeoCode) {
        params = {
            libraries: ['drawing', 'places'],
            apiKey: chaveMapa
        };

        mapType = InlogMaps.MapType.Google;

    } else {
        params = {
        };

        mapType = InlogMaps.MapType.Leaflet

    }

    mSelf.currentMap.initialize(mapType, params, "TrocaVeiculo");
}

function saveRouting() {
    if (rotaOrigem() && rotaDestino()) {
        listaRotasSalvas.push({
            origem: rotaOrigem(),
            destino: rotaDestino(),
            tempo: tempoDeslocamento()
        })

        clearMap(vm.currentMap.map.map.mapTypeId);

        rotaOrigem(null);
        rotaDestino(null);
        tempoDeslocamento(null);
    }
}

function clearMap(mapType) {
    const mSelf = vm;
    if (mSelf.currentMap.polylineExists(mapType)) {
        mSelf.currentMap.removePolylines(mapType);
    }

    if (mSelf.currentMap.markerExists(mapType)) {
        mSelf.currentMap.removeMarkers(mapType);
    }
}

function deleteSavedRoute(index) {
    listaRotasSalvas.remove(index);
}

function deleteAllSavedRoutes() {
    listaRotasSalvas.removeAll();
}

function drawPolyline(pontos) {
    if (rotaOrigem() && rotaDestino()) {
        const mSelf = vm;
        const mapType = mSelf.currentMap.map.map.mapTypeId;
        clearMap(mapType)

        const icon_inicio = new InlogMaps.MarkerIcon("../../Content/Operacao/Operacoes/img/icons/icon_inicio.png");
        const icon_fim = new InlogMaps.MarkerIcon("../../Content/Operacao/Operacoes/img/icons/icon_fim.png");

        addMarker(formatLatLong(rotaOrigem().Latitude), formatLatLong(rotaOrigem().Longitude), icon_inicio);
        addMarker(formatLatLong(rotaDestino().Latitude), formatLatLong(rotaDestino().Longitude), icon_fim);

        let options = new InlogMaps.PolylineOptions();

        options.path = [];
        pontos.forEach(function (ponto) {
            latLong = [ponto.latitude, ponto.longitude];
            options.path.push(latLong);
        });

        options.addToMap = true;
        options.fitBounds = true;
        options.color = "#009ACA";
        options.draggable = false;
        options.editable = false;
        options.object = {
            item: 'New'
        };

        mSelf.currentMap.drawPolyline(mapType, options);
        LoadingOff();
    }
}

function drawSavedRoute(route) {
    rotaOrigem(route.origem);
    rotaDestino(route.destino);

    getRoutes();
}

function getRoutes() {

    if (rotaOrigem() && rotaDestino()) {
        LoadingOn();
        
        let optionsPath = [
            { id: "1", latitude: formatLatLong(rotaOrigem().Latitude), longitude: formatLatLong(rotaOrigem().Longitude), funcao: "Inicio" },
            { id: "2", latitude: formatLatLong(rotaDestino().Latitude), longitude: formatLatLong(rotaDestino().Longitude), funcao: "Fim" }
        ];

        $.ajax({
            type: "POST",
            url: RoutesUrl,
            dataType: "json",
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify({ pontosFixos: true, dataSaida: new Date().toUTCString(), pontos: optionsPath }),
            headers: { "Authorization": RoutesToken },
            success: function (data) {
                drawPolyline(data.resultado.trechos[0].pontos);
                tempoDeslocamento(formatTempoDeViagem(data.resultado.tempoDeViagem));
            },
            error: function (erro) {
                console.log(erro);
            }
        });
    }
}

function addMarker(latitude, longitude, icon) {
    const mSelf = vm;
    const mapType = mSelf.currentMap.map.map.mapTypeId;

    let options = new InlogMaps.MarkerOptions([latitude, longitude]);
    options.addToMap = true;
    options.fitBounds = false;
    options.draggable = false;
    options.icon = icon;

    mSelf.currentMap.drawMarker(mapType, options);
}

function formatLatLong(latLong) {
    latLong = latLong.toString();
    if (latLong.length > 9) {
        latLong = latLong.replace(/(\d{3})/, "$1.");
    } else {
        latLong = latLong.replace(/(\d{2})/, "$1.");
    }

    return parseFloat(latLong);
}

function formatTempoDeViagem(segundos) {
    var duracao = "";
    var year = 0,
        month = 0,
        day = 0,
        hours = 0,
        minutes = 0,
        seconds = segundos,
        milliseconds = 0;
    var dt = new Date(
        year,
        month,
        day,
        hours,
        minutes,
        seconds,
        milliseconds
    );

    if (dt.getSeconds() >= 1) {
        if (dt.getSeconds() === 1) {
            duracao += "e " + dt.getSeconds() + " segundo ";
        } else {
            duracao = dt.getSeconds() + " segundos ";
        }
    }

    if (dt.getMinutes() >= 1) {

        if (dt.getMinutes() === 1) {
            duracao = dt.getMinutes() + " minuto ";
        } else {
            duracao = dt.getMinutes() + " minutos ";
        }

        if (dt.getSeconds() >= 1) {
            duracao += "e " + dt.getSeconds() + " segundos ";
        }

    }

    if (dt.getHours() >= 1) {

        if (dt.getHours() === 1) {
            duracao = dt.getHours() + " hora ";
        } else {
            duracao = dt.getHours() + " horas ";
        }

        if (dt.getMinutes() === 1) {
            duracao += "e " + dt.getMinutes() + " minuto ";
        } else if (dt.getMinutes() > 1) {
            duracao += "e " + dt.getMinutes() + " minutos ";
        }

        if (dt.getSeconds() === 1) {
            duracao += "e " + dt.getSeconds() + " segundo ";
        } else if (dt.getSeconds() > 1) {
            duracao += "e " + dt.getSeconds() + " segundos ";
        }

    }
    return duracao;
}

function getUserInfo() {
    const cookieToJson = JSON.parse(getCookie("Inlog.Autenticador.PublicToken"));
    const token = b64DecodeUnicode(cookieToJson.token).split(';');

    return {
        'codigo': token[2],
        'nome': token[3],
        'empresa': token[5],
        'empresaId': parseInt(token[4], 10)
    };
}

function b64DecodeUnicode(str) {
    return decodeURIComponent(Array.prototype.map.call(atob(str),
        (c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join(''));
}


function getCookie(cname) {
    var name = cname + "=";
    var decodedCookie = decodeURIComponent(document.cookie);
    var ca = decodedCookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) == 0) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}

function closeTab() {
    self.opener = this;
    self.close();
}