local QBCore = exports['qb-core']:GetCoreObject()

-- [ MAIN ] --

local shopItems = Config.Items

local function toggleField(enable)
    SetNuiFocus(enable, enable)

    if enable then
        SendNUIMessage({
            action = 'open'
        })
    else
        SendNUIMessage({
            action = 'close'
        })
    end
end

RegisterNUICallback('escape', function(data, cb)
    toggleField(false)
    SetNuiFocus(false, false)

    cb('ok')
end)

RegisterNUICallback('buy', function(data, cb)
    local shoppingCart = data.shoppingCart
    local totalprice = 0
    for item, v in pairs(shoppingCart) do
        local configItem = shopItems[item]
        totalprice += (v.amount * configItem.price)
    end

    if (ESX) then
        ESX.TriggerServerCallback('qb-shop:canAfford', function(bool)
            if (bool) then
                Config.Notification(Config.Locale.buyed:format(totalprice), 'success')
            else
                Config.Notification(Config.Locale.nomoney, 'error')
            end
            SetNuiFocus(not bool, not bool)
            cb(bool)
        end, totalprice, shoppingCart)
    elseif (QBCore) then
        QBCore.Functions.TriggerCallback('qb-shop:canAfford', function(bool)
            if (bool) then
                Config.Notification(Config.Locale.buyed:format(totalprice), 'success')
            else
                Config.Notification(Config.Locale.nomoney, 'error')
            end
            SetNuiFocus(not bool, not bool)
            cb(bool)
        end, totalprice, shoppingCart)
    end
end)

local function addItem(category, item, display, price, description)
    SendNUIMessage({
        action = 'add',
        category = category,
        item = item,
        display = display,
        price = price,
        description = description,
    })
end

local function ShowHelpNotification(msg)
    AddTextEntry('shopsHelpNotification', msg)
    DisplayHelpTextThisFrame('shopsHelpNotification', false)
end

CreateThread(function()
    while true do
        local msec = 750
        local pCoords = GetEntityCoords(PlayerPedId())
        for key, value in pairs(Config.Shops) do
            local dist = #(pCoords - vector3(value.x, value.y, value.z))
            if (dist <= 20.0) then
                msec = 0
                if dist <= 1.5 then
                    if not displayedText then
                        exports['qb-core']:DrawText("TRYK [E] FOR AT ÅBNE SHOPPEN", 'top')
                        displayedText = true
                    end

                    if IsControlJustReleased(0, 38) then
                        SendNUIMessage({
                            action = 'clear'
                        })
                        for item, value2 in pairs(shopItems) do
                            addItem(value2.category, item, value2.display, value2.price, value2.description)
                        end
                        toggleField(true)
                        exports['qb-core']:HideText()
                        displayedText = false
                    end
                else
                    displayedText = false
                    exports['qb-core']:HideText()
                end
            end
        end
        Wait(msec)
    end
end)

local activeBlips = {} -- Table to store active blips

CreateThread(function()
    RequestStreamedTextureDict("shops", 1)
    while not HasStreamedTextureDictLoaded("shops") do
        Wait(0)
    end
    for k, coords in pairs(Config.Shops) do
        if not activeBlips[k] then
            if coords.type == 1 then return end
                local blip = AddBlipForCoord(coords.x, coords.y, coords.z)
                SetBlipSprite(blip, 59)
                SetBlipScale(blip, 0.6)
                SetBlipDisplay(blip, 4)
                SetBlipAsShortRange(blip, true)
                BeginTextCommandSetBlipName("STRING")
                AddTextComponentString(coords.blipname)
                EndTextCommandSetBlipName(blip)

                if coords.type == 2 then
                    exports['blip_info']:SetBlipInfoTitle(blip, "Småkagebutik", 0)
                    exports['blip_info']:SetBlipInfoImage(blip, "shops", "cookies")
                    exports['blip_info']:AddBlipInfoName(blip, "Ejet af", "Staten")
                    exports['blip_info']:AddBlipInfoName(blip, "Type", "Butik")
                    exports['blip_info']:AddBlipInfoHeader(blip, "")
                    exports['blip_info']:AddBlipInfoHeader(blip, "")
                    exports['blip_info']:AddBlipInfoText(blip, "Sød tand? Køb dine småkager her!")
                else
                    exports['blip_info']:SetBlipInfoTitle(blip, "24/7 SuperMarket", 0)
                    exports['blip_info']:SetBlipInfoImage(blip, "shops", "24")
                    exports['blip_info']:AddBlipInfoName(blip, "Ejet af", "Staten")
                    exports['blip_info']:AddBlipInfoName(blip, "Type", "Butik")
                    exports['blip_info']:AddBlipInfoHeader(blip, "")
                    exports['blip_info']:AddBlipInfoHeader(blip, "")
                    exports['blip_info']:AddBlipInfoText(blip, "Åben 24/7, klar til at dække dit behov!")
                end
                activeBlips[k] = blip
        end
    end
end)

AddEventHandler('onResourceStop', function(resource)
    if resource == GetCurrentResourceName() then
        for k, v in pairs(activeBlips) do
            exports['blip_info']:ResetBlipInfo(v)
            RemoveBlip(v)
        end
    end
end)