BGBlur = true
ActionsOpen = false
ChangedKeys = []
DoorNotify = false
CurrentKeyPage = 1
let translations = {};
async function loadTranslations(lang) {
    try {
        const response = await fetch(`../locales/${lang}.json`);
        translations = await response.json();
        updateText()
    } catch (error) {
        console.error("Error loading translation:", error);
    }
}
function updateText() {
    document.querySelectorAll("[data-i18n]").forEach(element => {
        const key = element.getAttribute("data-i18n");
        if (element.hasAttribute("placeholder")) {
            element.setAttribute("placeholder", translations[key]);
        } else {
            element.innerHTML = translations[key]; 
        }
    });
}
function t(key) {
    return translations[key] || key; 
}
window.addEventListener('message', function(event) {
    let data = event.data
    if (data.action == "NUILanguage") {
        loadTranslations(data.language);
    }
    else if (data.action === "OpenKeysMenu") {
        MyKeys = data.mykeys
        CreateKeyMenu()
        BackgroundBlur("plugin_1", 'key_panel')
        if (ActionsOpen){
            BackgroundBlur("plugin_1", 'key_panel', true)
            MakeKeysDraggable()
        }
        else{
            BackgroundBlur("plugin_1", 'key_panel')
        }
        ChangedKeys = []
    } 
    if (data.action === "OpenLostKeyMenu") {
        MyVehicles = data.myvehicles
        VehicleKeyPrice = data.price
        Currency = data.currencyform
        CreateKeyPurchaseMenu()
        show('key_purchase_menu')
        BackgroundBlur("plugin_2", 'key_purchase_panel')
    }
    if (data.action === "DoorState") {
        DoorState = data.status
        if (DoorState == 'unlocked'){
            $(".key_notify .text").html(t('doors_unlocked'))
            document.getElementById('line').classList.remove("red")
        }
        else{
            $(".key_notify .text").html(t('doors_locked'))
            document.getElementById('line').classList.add("red")
        }
        $('.key_notify').css('display', 'block')
        $('.key_notify .container').css('animation', 'container 1s ease both')
        if (DoorNotify){
            clearTimeout(DoorNotify)
        }
        DoorNotify = setTimeout(() => {
            $('.key_notify .container').css('animation', 'reverse_container 1s ease both')
            setTimeout(() => {
                $('.key_notify').css('display', 'none')
                DoorNotify = false
            }, 800);
        }, 4000);
    }
    else if (data.action === "close") {
        Close()
    }
})
document.onkeydown = function(data) {
    if (event.key == 'Escape') {
        Close()
    }
}
function Close(){
    CloseKeyMenu()
    hide('key_purchase_menu')
    $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "close", table:ChangedKeys}))
    ChangedKeys = []
}
function CreateKeyPurchaseMenu(){
    $('.vehicles_container').html('')
    for (let i = 0; i < MyVehicles.length; i++) {
        $('.vehicles_container').append(`
            
                
                ${MyVehicles[i].plate}
                ${VehicleKeyPrice.toLocaleString('hu-HU')+' '+Currency}
                
             
        `)
    }
}
function SendBuyKeyForVehicle(plate){
    $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "lostKey", plate}))
}
function CreateKeyMenu(){
    $('.key_menu').css('display', 'block')
    $('.key_menu .animation_element').css('animation', 'animation_element 1s ease both')
    $('.key_menu .overflow_container').css('animation', 'overflow_container 1s ease both')
    $('.key_menu .panel').css('animation', 'panel 1s ease both')
    CreatePageSelector()
    InsertDataToPanel()
}
function SendChangeLock(keyid){
    $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "changeLock", keyid, table:ChangedKeys}))
    ChangedKeys = []
}
function SendCopy(keyid){
    $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "copyKey", keyid, table:ChangedKeys}))
    ChangedKeys = []
}
function SendDeleteAll(keyid, plate){
    $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "deleteAll", keyid, table:ChangedKeys, plate}))
    ChangedKeys = []
}
function CloseKeyMenu(){
    $('.key_menu .animation_element').css('animation', 'reverse_animation_element 1s ease both')
    $('.key_menu .overflow_container').css('animation', 'reverse_overflow_container 1s ease both')
    $('.key_menu .panel').css('animation', 'reverse_panel 1s ease both')
    if (ActionsOpen){
        document.getElementById('actions_btn').classList.remove("active")
        $('.key_menu .overflow_container').css('transform', 'translate(0px, -50%)') 
        $('.actions_section #actions_panel').css('animation', 'reverse_actions_panel 0.3s both')
        
        MakeKeysNotDraggable()
        setTimeout(() => {
            ActionsOpen = false
            BackgroundBlur("plugin_1", 'key_panel')
            $('.actions_section').css('display', 'none')
        }, 400);
    }
    setTimeout(() => {
        $('.key_menu').css('display', 'none')
    }, 700);
}
function ChooseKeyPage(element, number){
    MakeKeysNotDraggable()
    CurrentKeyPage = number+1
    for (let i = 0; i < NumberOfPages; i++) {
        document.getElementById("page_"+i).classList.remove("choosed")
    }
    element.classList.add("choosed")
    InsertDataToPanel()
    if (ActionsOpen){
        MakeKeysDraggable()
    }
}
function CreatePageSelector(){
    BiggestSlot = 1
    for (let i = 0; i < MyKeys.length; i++) {
        if (MyKeys[i].slot > BiggestSlot){
            BiggestSlot = MyKeys[i].slot
        }
    }
    NumberOfPages = (BiggestSlot-(BiggestSlot%24))/24+1
    $(".page_selector_container").html('')
    if (NumberOfPages > 1){
        for (let i = 0; i < NumberOfPages; i++) {
            if (CurrentKeyPage-1 == i){
                $(".page_selector_container").append(`
                    
                `)
            }
            else{
                $(".page_selector_container").append(`
                    
                `)
            }
        }
    }
}
function InsertDataToPanel(){
    $('.keys_container').html('')
    for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) {
        if (MyKeys.length != 0){
            for (let _i = 0; _i < MyKeys.length; _i++) {
                if (MyKeys[_i] != undefined && MyKeys[_i].slot-1 == i){
                    let options = {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit"};
                    let date = new Date(MyKeys[_i].time * 1000);
                    $('.keys_container').append(`
                        
                            
                            ${MyKeys[_i].quantity>1?MyKeys[_i].quantity:''}
                            ${MyKeys[_i].label}
                            ${MyKeys[_i].type == 'temporary_key'?`
`:''}
                            
                         
                    `) 
                    break
                }
                else if(_i+1 == MyKeys.length){
                    $('.keys_container').append(`
                        
                    `)
                    break
                }
            }
        }
        else{
            $('.keys_container').append(`
                
            `)
        }
    }
    document.querySelectorAll(".key_image").forEach(el => {
        const dropdownMenu = new bootstrap.Dropdown(el);
        el.addEventListener("contextmenu", function (event) {
            event.preventDefault(); 
            document.querySelectorAll(".key_image").forEach(otherEl => {
                if (otherEl !== el) {
                    new bootstrap.Dropdown(otherEl).hide(); 
                }
            });
            dropdownMenu.show(); 
        });
    
        document.addEventListener("click", function () {
            dropdownMenu.hide();
        });
    });
}
function MakeKeysDraggable(){
    for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) {
        for (let _i = 0; _i < MyKeys.length; _i++) {
            if (MyKeys[_i] != undefined && MyKeys[_i].slot-1 == i){
                dragElement(document.getElementById('key_'+i), 'key_'+i, MyKeys[_i].id, _i)
            }
        }
    }
}
function MakeKeysNotDraggable(){
    for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) {
        for (let _i = 0; _i < MyKeys.length; _i++) {
            if (MyKeys[_i] != undefined && MyKeys[_i].slot-1 == i){
                document.getElementById('key_'+i).onmousedown = null
            }
        }
    }
}
function CreateActionPage(){
    if (!ActionsOpen){
        ActionsOpen = true
        document.getElementById('actions_btn').classList.add("active")
        $('.key_menu .overflow_container').css('transform', 'translate(-100px, -50%)')
        BackgroundBlur("plugin_1", 'key_panel', true)
        
        $('#actions_panel').css('height', $('.key_menu .panel').height()+'px')
        $('.actions_section #actions_panel').css('animation', 'actions_panel 0.3s ease both')
        $('.actions_section').css('display', 'block')
        
        MakeKeysDraggable()
        TriggerCallback('getClosestPlayers', {}).done((cb) => {
            ClosestPlayers = cb
            $('.people_container').html('')
            if (ClosestPlayers.length > 0){
                for (let i = 0; i < ClosestPlayers.length; i++) {
                    $('.people_container').append(`
                        
                            
                            
                            ID ${ClosestPlayers[i].id}
                         
                    `)
                }
            }
            else{
                $('.people_container').append(`
                    
                `)
            }
        });
    }
    else{
        document.getElementById('actions_btn').classList.remove("active")
        $('.key_menu .overflow_container').css('transform', 'translate(0px, -50%)') 
        $('.actions_section #actions_panel').css('animation', 'reverse_actions_panel 0.3s both')
        
        MakeKeysNotDraggable()
        setTimeout(() => {
            ActionsOpen = false
            BackgroundBlur("plugin_1", 'key_panel')
            $('.actions_section').css('display', 'none')
        }, 400);
    }
}
function TriggerCallback(event, data) {
    data.action = event;
    return $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify(data)).promise();
}
function BackgroundBlur(element, target, value) {
    if (BGBlur){
        var bodyRect = document.body.getBoundingClientRect();
        let elemRect = getTotalBoundingBox(target); 
        
        if (!elemRect) return;
        let offset = [];
        if (value){
            offset = [
                (elemRect.top - bodyRect.top)-2, 
                ((elemRect.right - bodyRect.right) * (-1))-150, 
                (elemRect.bottom - bodyRect.bottom)+2, 
                (elemRect.left - bodyRect.left)-100
            ];
        }
        else{
            offset = [
                (elemRect.top - bodyRect.top)-2, 
                ((elemRect.right - bodyRect.right) * (-1))-1, 
                (elemRect.bottom - bodyRect.bottom)+2, 
                (elemRect.left - bodyRect.left)-1
            ];
        }
    
        $('#' + element).css('clip-path', `inset(${offset[0]}px ${offset[1]}px calc(100% - ${offset[2]}px) ${offset[3]}px)`);
    }
    else{
        $('#' + element).css('display', 'none')
    }
}
function getTotalBoundingBox(target) {
    const elem = document.getElementById(target);
    if (!elem) return null;
    let elemRect = elem.getBoundingClientRect();
    let minX = elemRect.left;
    let minY = elemRect.top;
    let maxX = elemRect.right;
    let maxY = elemRect.bottom;
    Array.from(elem.children).forEach(child => {
        let childRect = child.getBoundingClientRect();
        minX = Math.min(minX, childRect.left!=0?childRect.left:99999);
        minY = Math.min(minY, childRect.top!=0?childRect.top:99999);
        maxX = Math.max(maxX, childRect.right);
        maxY = Math.max(maxY, childRect.bottom);
    });
    return {
        width: maxX - minX,
        height: maxY - minY,
        left: minX,
        top: minY,
        right: maxX,
        bottom: maxY
    };
}
function show(element) {
    $("#" + element).css("display", "block")
    document.getElementById(element).style.animation = "showmenu 0.35s ease";
}
function hide(element) {
    document.getElementById(element).style.animation = "hidemenu 0.3s ease";
    setTimeout(function() {
        $("#" + element).css("display", "none")
    }, 300)
}
function isNumber(evt) {
    evt = (evt) ? evt : window.event
    var charCode = (evt.which) ? evt.which : evt.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57)) {
        return false
    }
    return true
}
////////////////////////////////////////////// DRAGGING //////////////////////////////////////////////////
OGPos = {}
function dragElement(elmnt, item, keyid, index) {
  var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
  if (OGPos[item] == null){
    OGPos[item] = { x: null, y: null }
    OGPos[item].x = elmnt.offsetLeft
    OGPos[item].y = elmnt.offsetTop
  }
  elmnt.onmousedown = dragMouseDown
  function dragMouseDown(e) {
    e = e || window.event;
    e.preventDefault();
    pos3 = e.clientX;
    pos4 = e.clientY;
    document.onmouseup = closeDragElement;
    document.onmousemove = elementDrag;
  }
  function elementDrag(e) {
    e = e || window.event
    e.preventDefault()
    pos1 = pos3 - e.clientX
    pos2 = pos4 - e.clientY
    pos3 = e.clientX
    pos4 = e.clientY
    elmnt.style.opacity = "0.8"
    elmnt.style.top = (elmnt.offsetTop - pos2) + "px"
    elmnt.style.left = (elmnt.offsetLeft - pos1) + "px"
    if (elementsOverlap(elmnt, document.getElementById("key_panel"), true) == false && elementsOverlap(elmnt, document.getElementById("actions_panel")) == false){
        closeDragElement(e)
    }
    for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) {
        if (document.getElementById("empty_"+i) != undefined){
            if (elementsOverlapPrecise(document.getElementById("empty_"+i), e.clientX, e.clientY) == false){
                document.getElementById('empty_'+i).classList.remove("hovered")
            }
            else{
                document.getElementById('empty_'+i).classList.add("hovered")
            }
        }
    }
    for (let i = 0; i < ClosestPlayers.length; i++) {
        if (elementsOverlapPrecise(document.getElementById("player_"+i), e.clientX, e.clientY) == false){
            document.getElementById('player_'+i).classList.remove("hovered")
        }
        else{
            document.getElementById('player_'+i).classList.add("hovered")
        }
    }
    if (elementsOverlapPrecise(document.getElementById("key_delete"), e.clientX, e.clientY) == false){
        document.getElementById('key_delete').classList.remove("hovered")
    }
    else{
        document.getElementById('key_delete').classList.add("hovered")
    }
  }
  function closeDragElement(e) {
    UseElement(elmnt, item, e.clientX, e.clientY, keyid, index)
    elmnt.style.opacity = "1"
    document.onmouseup = null;
    document.onmousemove = null;
  }
}
function UseElement(elmnt, item, X, Y, keyid, index){
  let elm = elmnt
    for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) {
        if (document.getElementById("empty_"+i) != undefined){
            if (elementsOverlapPrecise(document.getElementById("empty_"+i), X, Y) == false){
                document.getElementById('empty_'+i).classList.remove("hovered")
            }
            else{
                for (const key in ChangedKeys) {
                    if (ChangedKeys[key].keyid == keyid){
                        ChangedKeys.splice(key, 1)
                    }
                }
                for (const key in MyKeys) {
                    if (MyKeys[key].id == keyid){
                        if (MyKeys[key].oldSlot == undefined || MyKeys[key].oldSlot != i+1){
                            ChangedKeys.push({keyid: keyid, slot:i+1, plate:MyKeys[key].plate})
                            break
                        }
                    }
                }
                
                MakeKeysNotDraggable()
                if (MyKeys[index].oldSlot == undefined){
                    MyKeys[index].oldSlot = MyKeys[index].slot
                }
                MyKeys[index].slot = i+1
                InsertDataToPanel()
                MakeKeysDraggable()
                return
            }
        }
    }
    for (let i = 0; i < ClosestPlayers.length; i++) {
        if (elementsOverlapPrecise(document.getElementById("player_"+i), X, Y)){
            $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "giveKey", playerid:ClosestPlayers[i].id, keyid, table:ChangedKeys}))
            document.getElementById('player_'+i).classList.remove("hovered")
            ChangedKeys = []
            return
        }
    }
    if (elementsOverlapPrecise(document.getElementById("key_delete"), X, Y)){
        $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "deleteKey", keyid, table:ChangedKeys, plate:MyKeys[index].plate}))
        document.getElementById('key_delete').classList.remove("hovered")
        ChangedKeys = []
        return
    }
   /* if (elementsOverlap(elm, document.getElementById("head_box")) && Damages.head){
        ItemAnim(elm, item)
    }
    else if(elementsOverlap(elm, document.getElementById("head_box")) && Damages.head == false){
        WrongItemAnim(elm, item)
    }
    else{
        elm.style.top = OGPos[item].y + "px"
        elm.style.left = OGPos[item].x + "px"
    }*/
    elm.style.top = OGPos[item].y + "px"
    elm.style.left = OGPos[item].x + "px"
}
function ItemAnim(elm, item, part){
  elm.style.animation = 'none';
  elm.offsetHeight;
  elm.style.animation = "itemuseanim 1.2s";
  setTimeout(function(){
    elm.style.top = OGPos[item].y + "px"
    elm.style.left = OGPos[item].x + "px"
    elm.style.animation = 'none';
    Close()
  },1200)
  $.post('https://'+GetParentResourceName()+'/UseButton', JSON.stringify({action:"MedicerMenu", type:"useitem", item, you:Mediceryou, part}))
}
function WrongItemAnim(elm, item){
  elm.style.animation = 'none';
  elm.offsetHeight;
  elm.style.animation = "itemnotuseanim 0.8s";
  setTimeout(function(){
    elm.style.top = OGPos[item].y + "px"
    elm.style.left = OGPos[item].x + "px"
    elm.style.animation = 'none';
  },800)
}
function elementsOverlap(el1, el2, value) {
    const domRect1 = el1.getBoundingClientRect();
    const domRect2 = el2.getBoundingClientRect();
  
    if (value){
        return !(
            domRect1.top+50 > domRect2.bottom ||
            domRect1.right-50 < domRect2.left ||
            domRect1.bottom-50 < domRect2.top ||
            domRect1.left-50 > domRect2.right
          );
    }
    else{
        return !(
            domRect1.top+50 > domRect2.bottom ||
            domRect1.right-50 < domRect2.left ||
            domRect1.bottom-50 < domRect2.top ||
            domRect1.left+50 > domRect2.right
          );
    }
}
function elementsOverlapPrecise(el1, X, Y) {
    const domRect1 = el1.getBoundingClientRect();
    
    return !(
        domRect1.top > Y ||
        domRect1.right < X ||
        domRect1.bottom < Y ||
        domRect1.left > X
        );
    
}