function stahnoutKatalog(data) {
    // převod na JSON string
    const jsonString = JSON.stringify(katalog2JSON(), null, 2);

    // vytvoření blobu (soubor v paměti)
    const blob = new Blob([jsonString], { type: "application/json" });

    // vytvoření odkazu
    const url = URL.createObjectURL(blob);
    const a = document.createElement("a");

    a.href = url;
    a.download = "katalog.json";

    // simulace kliknutí
    a.click();

    // úklid
    URL.revokeObjectURL(url);
}

function uuidv4() {
    return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, c =>
    (+c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> +c / 4).toString(16)
    );
}

function prepocitejCenu(rozmery, vstupniCena, mj) {
    vat = 21
    vatKoeficient = (1 + (vat/100))
    desetinnaMista = 4  //  Ucetni vypocet ceny se provadi s presnosti na x desetinnych mist

    let cena = {
        "bezDPH": vstupniCena.toFixed(desetinnaMista),
        "sDPH": (vstupniCena * vatKoeficient).toFixed(desetinnaMista),
        "ks": -1
    }

    if (mj == "ks") {
        cena.ks = cena.sDPH
    }
    // MJ = m; cena je s DPH za m
    // pouzije se pouze nejvetsi z rozmeru
    else if (mj == "m") {
        delka = (rozmery.pop()/100).toFixed(desetinnaMista)
        cena.ks = cena.sDPH * delka
    }
    // MJ = m2; cena je s DPH za m2
    // zahazuje se nejmensi ze tri rozmeru
    else if (mj == "m2") {
        obsah = ((rozmery.pop()*rozmery.pop())/10000).toFixed(desetinnaMista)
        cena.ks = cena.sDPH * obsah
    }
    // MJ = m3; cena je s DPH za m3
    else if (mj == "m3") {
        objem = ((rozmery.pop()*rozmery.pop()*rozmery.pop())/1000000).toFixed(desetinnaMista)
        //cena.ks = cena.sDPH/(1000000/(rozmery.pop()*rozmery.pop()*rozmery.pop()))
        cena.ks = cena.sDPH * objem
    }
    return cena
}

function zapniNaElementSortableJS(el) {
    new Sortable(el, {
        group: 'nested',
        animation: 150,
        fallbackOnBody: true,
        filter: ".ignore-elements",
        onMove: function (evt) {
            const dragged = evt.dragged;   // element, který se táhne
            const target = evt.to;         // element, kam by měl být vložen
            const isPolozka  = dragged.classList.contains('polozka'); // např. kategorie mají class 'category'
            const targetIsKatalog = target.classList.contains('katalog');     // produkty mají class 'item'
            // Pokud se snažíme vložit kategorii do produktu, zablokuj
            if (! isPolozka && ! targetIsKatalog) {
                return false; // zakáže přesun
            }
            return true; // jinak povolit
        },
        swapThreshold: 0.65
    });
}

//  Rucne vyrobit polozku
document.addEventListener("click", function(event) {
    if (event.target.id == "nahratKata") {
         document.getElementById("inputFile").click()   //  Simuluje kliknuti na input>file

         // zpracování souboru
         document.getElementById("inputFile").addEventListener("change", (e) => {
             const file = e.target.files[0];
             if (!file) return;

             const reader = new FileReader();

             reader.onload = () => {
                 try {
                     const data = JSON.parse(reader.result);
                     JSON2Katalog(reader.result)
                 } catch (err) {
                     console.error("Neplatný JSON");
                 }
             };

             reader.readAsText(file);

         });
    }
    if (event.target.classList.contains("pridat-polozku")) {
        let kategorie = event.target.closest(".kategorie");
        let seznam = kategorie.querySelector(".polozky");
        let nova = vyrobPolozku("Nova polozka", 100, "m3", "10/10/100");
        seznam.appendChild(nova);
    }
//  Rucne vyrobit kategorii
    if (event.target.classList.contains("pridat-kategorii")) {
        //let katalog = event.target.closest(".katalog");
        let katalog = document.getElementById("katalog")
        let nova = vyrobKategorii("Nova Kategorie");
        katalog.appendChild(nova)
        //event.target.before(nova)
    }
    if (event.target.classList.contains("vymaz-kat")) {
        let potvrzeni = confirm("Opravdu vymazat?")
        if(potvrzeni) {
            event.target.closest(".kategorie").remove()
        }
    }
    if (event.target.classList.contains("vymaz")) {
        let potvrzeni = confirm("Opravdu vymazat?")
        if(potvrzeni) {
            event.target.closest(".polozka").remove()
        }
    }
});
document.addEventListener("change", function(event) {
    if(event.target.classList.contains("prepocitavaniCeny")) {
        let uuid = event.target.parentElement.id

        let vstupniCena = Number(document.getElementById("cena-"+uuid).value.replace(/,/,'.'))
        let mj = document.getElementById("mj-"+uuid).value
        let rozmery = document.getElementById("rozmery-"+uuid).value.replace(/,/,'.').split('/').map(Number).sort((x, y) => x - y)

        cena = prepocitejCenu(rozmery, vstupniCena, mj)

        document.getElementById("cenadph-"+uuid).value = Math.ceil(cena.sDPH)
        document.getElementById("cenaks-"+uuid).value = Math.ceil(cena.ks)

    }
    if(event.target.classList.contains("rozmery")) {
        //console.log(event.target.value)
        event.target.value = event.target.value.replaceAll(" ","/")
    }
});

function vyrobPolozku(nazev, cena, mj, rozmery, cenadph = -1, cenaks = -1) {

    let uuid = uuidv4()
    let btnDel = document.createElement("button");
    btnDel.className = "vymaz"
    btnDel.textContent = "✗"

    let nova = document.createElement("div");
    nova.className = "list-group-item nested-2 polozka";
    nova.id = uuid
    nova.appendChild(btnDel)

    let rozmeryPolozky = document.createElement("input")
    rozmeryPolozky.setAttribute("type", "text")
    rozmeryPolozky.className = "prepocitavaniCeny rozmery"
    rozmeryPolozky.value = rozmery
    rozmeryPolozky.id = "rozmery-" + uuid

    let cenaPolozky = document.createElement("input")
    cenaPolozky.setAttribute("type", "text")
    cenaPolozky.className = "prepocitavaniCeny"
    cenaPolozky.value = cena
    cenaPolozky.id = "cena-" + uuid

    let cenaPolozkySDPH = document.createElement("input")
    cenaPolozkySDPH.setAttribute("type", "text")
    cenaPolozkySDPH.id = "cenadph-" + uuid
    cenaPolozkySDPH.value = (cena >= 0) ? cenadph : 0
    let cenaPolozkyKs = document.createElement("input")
    cenaPolozkyKs.setAttribute("type", "text")
    cenaPolozkyKs.id = "cenaks-" + uuid
    cenaPolozkyKs.value = (cena >= 0) ? cenaks : 0

    let mjPolozky = document.createElement("select")
    mjPolozky.id = "mj-" + uuid
    mjPolozky.className = "prepocitavaniCeny"
    let mjMoznosti = [{"klic": "m", "hodnota": "m"}, {"klic": "m2","hodnota": "m²"},{"klic": "m3","hodnota": "m³"},{"klic": "ks","hodnota": "ks"}]
    mjMoznosti.forEach((x, index, array) => {
        var option = document.createElement("option");
        option.value = x.klic
        option.text = x.hodnota
        mjPolozky.appendChild(option);
    });
    mjPolozky.value = mj

    // nova.appendChild(document.createTextNode(" Nazev "));
    // nova.appendChild(nazevPolozky)
    nova.appendChild(document.createTextNode(" Rozměry "));
    nova.appendChild(rozmeryPolozky)
    nova.appendChild(document.createTextNode(" MJ "));
    nova.appendChild(mjPolozky)
    nova.appendChild(document.createTextNode(" Cena bez DPH "));
    nova.appendChild(cenaPolozky)
    nova.appendChild(document.createTextNode(" Cena s DPH "));
    nova.appendChild(cenaPolozkySDPH)
    nova.appendChild(document.createTextNode(" Cena s DPH/ks "));
    nova.appendChild(cenaPolozkyKs)

    return nova
}

function nactiKatalogy() {
    url = "/skripty/katalog.php"
    $.ajax({
        type: "POST",
        url: url,
        dataType: "json",
           success: function(x, status, xhr) {
               $("#fileSelect").empty();
               for(i = 0; i < x.length; i++) {
                   option = '<option value="'+ x[i] + '">' + x[i] + '</option>';
                   $("#fileSelect").append(option)
               }
           }
    });
}

function katalog2JSON() {
    let katalog = {}
    $("#katalog").children().each(function(i) {
        let kategorie = $(this).find("input[id^='nazev-']").first().val();
        let produkty = {}
        $(this).find(".polozka").each(function(){
            let id = $(this).attr("id")
            let polozka = {}
            let nazev = $(this).find("input[id^='nazev-']").first().val()
            polozka["rozmery"] = $(this).find("input[id^='rozmery-']").first().val()
            polozka["cena"] = $(this).find("input[id^='cena-']").first().val()
            polozka["cenadph"] = $(this).find("input[id^='cenadph-']").first().val()
            polozka["cenaks"] = $(this).find("input[id^='cenaks-']").first().val()
            polozka["mj"] = $(this).find("select[id^='mj-'] :selected").val()
            produkty[id] = polozka
        })
        katalog[kategorie] = produkty
    })

    return katalog
}

function ulozitKatalog() {
    data = {"security_token":"jebatceckyhajzel", "akce":"nahraj", "katalog": katalog2JSON()}
    url = "/skripty/katalog.php"
    dataType = "json"

    $.ajax({
        type: "POST",
        url: url,
        data: JSON.stringify(data),
           dataType: "json",
           contentType: "application/json; charset=utf-8",
           success: function(x, status, xhr) {
               nactiKatalogy();
           }

    });

}

function vyrobKategorii(nazev) {
    let uuid = uuidv4()
    let kategorie = document.createElement("div")
    kategorie.className = "list-group-item nested-1 kategorie"
    let nazevKategorie = document.createElement("input")
    nazevKategorie.setAttribute("type", "text")
    nazevKategorie.value = nazev
    nazevKategorie.id = "nazev-" + uuid
    //kategorie.textContent = nazev
    kategorie.appendChild(nazevKategorie)
    let katProdCont = document.createElement("div")
    katProdCont.className = "list-group nested-sortable polozky"
    kategorie.appendChild(katProdCont)

    let pridavatko = document.createElement("button");
    pridavatko.className = "pridat-polozku"
    pridavatko.textContent = "Pridat Polozku"
    let btnDel = document.createElement("button");
    btnDel.className = "vymaz-kat"
    btnDel.textContent = "Odebrat Kategorii"

    kategorie.appendChild(btnDel)
    kategorie.appendChild(pridavatko)

    zapniNaElementSortableJS(katProdCont)

    return kategorie
}

function vyrobKatalog() {
    let kat = document.createElement("div")
    kat.className = "list-group nested-sortable katalog"
    kat.id = "katalog"
    zapniNaElementSortableJS(kat)
    return kat
}

//  Vygenerovat ze vzorovych dat
//  Tady se nepredpoklada dopocitani ceny s DPH a za kus
//  Cena s DPH a za kus bude ulozena v datech predem vyrobeneho katalogu
let kata = vyrobKatalog()


function naplnitKatalog() {
    let potvrzeni = confirm("Nacist vybrany katalog?\r !! Neulozene zmeny budou ztraceny !!")
    if(! potvrzeni) {
        return
    }
    document.getElementById("katalog").innerHTML=""

    let katalog;
    data = {"security_token":"jebatceckyhajzel", "akce":"obsah", "soubor": $("#fileSelect :selected").val()}
    url = "/skripty/katalog.php"
    dataType = "json"

    $.ajax({
        type: "POST",
        url: url,
        data: JSON.stringify(data),
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function(x, status, xhr) {
            JSON2Katalog(x)
        }

    });

}

function JSON2Katalog(x) {
    katalog = JSON.parse(x)
    Object.entries(katalog).forEach(([kategorie, produkty]) => {
        let kat = vyrobKategorii(kategorie)
        katProdCont = kat.getElementsByClassName("polozky")[0]
        Object.entries(produkty).forEach(([nazev, data]) => {
            let prod = vyrobPolozku(nazev, data.cena, data.mj, data.rozmery, data.cenadph, data.cenaks)
            katProdCont.appendChild(prod)
        });
        kata.appendChild(kat)
    });
}

function vystavitKatalog() {
    let soubor = $("#fileSelect :selected").val()
    let potvrzeni = confirm("Zverejnit katalog " + soubor + " na web ?")
    if(! potvrzeni) {
        return
    }

    data = {"security_token":"jebatceckyhajzel", "akce":"zverejni", "soubor": soubor}
    //url = "https://drevoprodej-benes.cz/skripty/katalog.php"
    url = "/skripty/katalog.php"
    dataType = "json"

    $.ajax({
        type: "POST",
        url: url,
        data: JSON.stringify(data),
        dataType: "json",
        contentType: "application/json; charset=utf-8",
    });
}

//  ????
document.getElementById("telo").appendChild(kata)

$(document).ready(function () {
    nactiKatalogy()
});


