// ================================== MAPOVÝ PODKLAD ====================================================================================
export function nacistMapu(latitude, longitude, zoom) {
    var map = L.map('map').setView([latitude, longitude], zoom);
    mapovyPodklad(map);

    return map;
}

function mapovyPodklad(map) {

    // Vytvořím vrstvu mapy, uložím si ji do proměnné pro pozdější použití
    var OSM = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
        attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
    })
    // Vrstvu mapy přidám do mapy
    //OSM.addTo(map);
    // =====================  JINÉ MAPOVÉ PODKLADY ============================


    // Jiná - hezčí vrstva - https://leaflet-extras.github.io/leaflet-providers/preview/
    var Stadia_OSMBright = L.tileLayer('https://tiles.stadiamaps.com/tiles/osm_bright/{z}/{x}/{y}{r}.png', {
        maxZoom: 20,
        attribution: '&copy; <a href="https://stadiamaps.com/">Stadia Maps</a>, &copy; <a href="https://openmaptiles.org/">OpenMapTiles</a> &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors'
    });
    // Přidá vrstvu do mapy, přepíše to starou vrstvu
    //Stadia_OSMBright.addTo(map);

    // google street 
    var googleStreets = L.tileLayer('http://{s}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}', {
        maxZoom: 20,
        subdomains: ['mt0', 'mt1', 'mt2', 'mt3']
    });
    googleStreets.addTo(map);

    /*==============================================
                    LAYER CONTROL
    ================================================*/
    var baseMaps = {
        "OSM": OSM,
        "Základní mapa": Stadia_OSMBright,
        "Google Street": googleStreets
    };
    L.control.layers(baseMaps).addTo(map);
}



export function vykreslitMarker(Constants, latitude, longitude, title, icon, informace, maxWidth, map) {
    //let marker = L.marker([novaStanice.lat, novaStanice.long], {title: novaStanice.nazev, icon: markerIcon}).addTo(map).bindPopup(informace, {maxWidth:400});
    //let informace = "<h1 style=\"margin-bottom: -1vh; font-size: 2.5vh;\">" + novaStanice.nazev + "</p>";
    let marker = L.marker([latitude, longitude], { title: title, icon: icon });

    marker.addTo(map).bindPopup(informace, { maxWidth: maxWidth });
    return marker;
}


export function vykreslitSpoje(Constants, poleSpoju, map) {
    poleSpoju.forEach(spoj => {
        vykreslitCestu(Constants, spoj, map);

    })
}

export function vykreslitCestu(Constants, spoj, map) {
    //let informace = "<p style=\"font-size: 130%; margin-bottom: 2px;\">Z <b>" + A.nazev + "</b> do <b>" + B.nazev + "</b></p>" + A.print();
    let informace = "<p style=\"font-size: 130%; margin-bottom: 2px;\">" + spoj.nazev + "</b></p>" + spoj.print();
    let latlngs = [
        [spoj.A.lat, spoj.A.long],
        [spoj.B.lat, spoj.B.long]
    ];

    // Barvy čáry pro různé přenosové technologie
    let promenna = "COLOR_";
    for (let i = 0; i < Constants.TECHNOLOGIE.length; i++){
        if (spoj.typ == Constants.TECHNOLOGIE[i]){
            promenna = promenna + Constants.TECHNOLOGIE_SHORTCUT[i].toUpperCase();
            break;
        }
    }

    let polyline;
    let barva;

    // BPL
    if (spoj.typ == "BPL") {
        // Je-li definována barva, nastaví se barva na definovanou
        if (Constants[promenna] != undefined && Constants[promenna].length > 0) barva = Constants[promenna];
        else {
            // Není-li definována barva, dopočte se podle koeficientu
            let red;
            let green;
            if (spoj.koeficient < Constants.KOEFICIENT_MINIMUM) {
                red = 255;
                green = 0;
            } else {
                red = 255 - (spoj.koeficient - Constants.KOEFICIENT_MINIMUM) * Constants.KOEFICIENT_BARVY;        // Bude-li koef minimální (0.2) - bude cesta úplně červená
                green = (spoj.koeficient - Constants.KOEFICIENT_MINIMUM) * Constants.KOEFICIENT_BARVY;          // Bude-li koef maximální (1) - bude cesta úplně zelená
            }
            barva = 'rgb(' + red.toString() + ',' + green.toString() + ',0)';
        }
    // Ostatní technologie
    } else {
        if (Constants[promenna] != undefined && Constants[promenna].length > 0) barva = Constants[promenna];
        else barva = Constants.COLOR_DEFAULT;
    }       

    polyline = L.polyline(latlngs, { color: barva, weight: 4.5 }).addTo(map).bindPopup(informace, { maxWidth: Constants.SIRKA_SPOJE_POPUP });
    spoj.visible = true;
    spoj.polyline = polyline;
}

export function skrytSpoj(spoj, bunka, radek, zabarvitBunku, map) {

    if (spoj.polyline != null) {
        spoj.polyline.removeFrom(map);
    }
    //if (bod.trasaDo != null)bod.trasaDo.removeFrom(map);
    //if (bod.trasaZ != null)bod.trasaZ.removeFrom(map);
    spoj.visible = false;
    if (zabarvitBunku) radek.style.backgroundColor = "LightCoral";
    //radek.bgColor = "LightCoral"
    //radek.style.color = "red";
}

export function zobrazitSpoj(spoj, bunka, radek, zabarvitBunku, map) {
    if (spoj.polyline != null) spoj.polyline.addTo(map);

    /*if (bod.predchoziStanice.visible){
        if (bod.trasaDo != null) bod.trasaDo.addTo(map);
    }
        
    if (bod.nasledujiciStanice.visible){
        if (bod.trasaZ != null) bod.trasaZ.addTo(map);
    } */

    spoj.visible = true;
    if (zabarvitBunku) radek.style.backgroundColor = "";
    //radek.bgColor = "";
    //radek.style.color = "black";
}

export function vykreslitStanice(Constants, poleStanic, map, ikona) {
    poleStanic.forEach(stanice => {

        // Pokud marker existoval, smažu ho
        if (stanice.marker != null) {
            skrytBod(stanice, "", "", false, map);
        }

        let informace = "<h1 style=\"font-size: 2.5vh;\">" + stanice.nazev + "</h1>";
        if (stanice.poznamka != undefined) {
            if (stanice.poznamka.length > 0) informace = informace + "<p style=\"font-size: 1.9vh;\"><b>Poznámka: </b>" + stanice.poznamka + "</p>";
        }

        let marker = vykreslitMarker(Constants, stanice.lat, stanice.long, stanice.nazev, ikona, informace, Constants.SIRKA_MARKER_POPUP, map);
        stanice.marker = marker;

        if (stanice.marker == undefined) {
            if (Constants.LOGOVANI) {
                console.log("CHYBA při vytváření markeru");
                console.log("Marker: ");
                console.log(marker);
                console.log("Stanice: ");
                console.log(stanice);
            }
            
            if (Constants.LOGOVANI) {
                if (stanice.marker == undefined) console.log("Pokus o opravu: NEÚSPĚCH");
                else console.log("Pokus o opravu: ÚSPĚCH");
            }

            stanice.marker = marker;
            
        }
        stanice.visible = true;
    })
}


export function skrytBod(bod, bunka, radek, zabarvitBunku, map) {
    if (bod.marker != null) {
        bod.marker.removeFrom(map);
    }
    bod.visible = false;
    if (zabarvitBunku) radek.style.backgroundColor = "LightCoral";
}

export function zobrazitBod(bod, bunka, radek, zabarvitBunku, map) {
    if (bod.marker != null) bod.marker.addTo(map);

    bod.visible = true;
    if (zabarvitBunku) radek.style.backgroundColor = "";
}

export function zobrazitVsechnyTopologie(Constants, poleTopologii, map) {
    poleTopologii.forEach(topologie => {
        if (!topologie.visible) zobrazitTopologii(Constants, topologie, true, map);
    })
}

export function skrytVsechnyTopologie(poleTopologii, map) {
    poleTopologii.forEach(topologie => {
        if (topologie.visible) skrytTopologii(topologie, true, map);
    })
}

export function zobrazitTopologii(Constants, topologie, zabarvitRadek, map) {
    if (topologie.poleStanic.length > 0) vykreslitStanice(Constants, topologie.poleStanic, map, Constants.markerIconBlack);

    if (topologie.poleSpoju.length > 0) vykreslitSpoje(Constants, topologie.poleSpoju, map);

    if (zabarvitRadek && topologie.radek != undefined) topologie.radek.style.backgroundColor = "";
    topologie.visible = true;

}

export function skrytTopologii(topologie, zabarvitRadek, map) {

    if (topologie.poleStanic.length > 0) {
        topologie.poleStanic.forEach(stanice => {
            if (stanice.visible) skrytBod(stanice, null, null, false, map);
        })
    }

    if (topologie.poleSpoju.length > 0) {
        topologie.poleSpoju.forEach(spoj => {
            if (spoj.visible) skrytSpoj(spoj, null, null, false, map);
        })
    }

    if (zabarvitRadek && topologie.radek != undefined) topologie.radek.style.backgroundColor = "LightCoral";
    topologie.visible = false;

}
