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

CreateThread(function()
    Upnatom = AddBlipForCoord(82.86, 281.48, 110.21)
    SetBlipSprite (Upnatom, 269)
    SetBlipDisplay(Upnatom, 4)
    SetBlipScale  (Upnatom, 0.6)
    SetBlipAsShortRange(Upnatom, true)
    SetBlipColour(Upnatom, 51)
    BeginTextCommandSetBlipName("STRING")
    AddTextComponentSubstringPlayerName("Up n Atoms")
    EndTextCommandSetBlipName(Upnatom)
end)

AddEventHandler('onResourceStart', function(resourceName)
    if GetCurrentResourceName() == resourceName then
        PlayerJob = QBCore.Functions.GetPlayerData().job
        UpnatomZones()
    end
end)

AddEventHandler('onResourceStop', function(resourceName) 
    if GetCurrentResourceName() == resourceName then
        for k, v in pairs(Config.Zones) do
            exports['qb-target']:RemoveZone("upnatom"..k)
        end
        DeletePed(jobPed)
    end 
end)

AddEventHandler('QBCore:Client:OnPlayerLoaded', function()
    PlayerJob = QBCore.Functions.GetPlayerData().job
    UpnatomZones()
end)

RegisterNetEvent('QBCore:Client:OnPlayerUnload', function()
    for k, v in pairs(Config.Zones) do
        exports['qb-target']:RemoveZone("upnatom"..k)
    end
    DeletePed(jobPed)
end)

function loadAnimDict(dict)
    while (not HasAnimDictLoaded(dict)) do
        RequestAnimDict(dict)
        Wait(0)
    end
end

function UpnatomZones()
    for k, v in pairs(Config.Zones) do
        exports['qb-target']:AddCircleZone("upnatom"..k, v.coords, v.radius, {
            name = "upnatom"..k,
            debugPoly = false,
            useZ=true,
        }, {
            options = {
                {
                    type = "client",
                    event = v.event,
                    icon = v.icon,
                    label = v.label,
                    job = v.job,
                },
            },
            distance = 1.5
        })
    end
    if not DoesEntityExist(jobPed) then

        RequestModel(Config.GaragePed) while not HasModelLoaded(Config.GaragePed) do Wait(0) end

	    jobPed = CreatePed(0, Config.GaragePed, Config.PedLocation, false, false)

        SetEntityAsMissionEntity(jobPed, true, true)
	    SetPedFleeAttributes(jobPed, 0, 0)
	    SetBlockingOfNonTemporaryEvents(jobPed, true)
	    SetEntityInvincible(jobPed, true)
	    FreezeEntityPosition(jobPed, true)
	    loadAnimDict("amb@world_human_leaning@female@wall@back@holding_elbow@idle_a")        
	    TaskPlayAnim(jobPed, "amb@world_human_leaning@female@wall@back@holding_elbow@idle_a", "idle_a", 8.0, 1.0, -1, 01, 0, 0, 0, 0)

        exports['qb-target']:AddTargetEntity(jobPed, { 
            options = {
            { 
                type = "client",
                event = "qb-upnatoms:client:jobGarage",
                icon = "fa-solid fa-clipboard-check",
                label = "Garage",
                job = "upnatoms"
            },
            { 
                type = "client",
                event = "qb-upnatoms:client:storeGarage",
                icon = "fa-solid fa-clipboard-check",
                label = "Store Vehicle",
                job = "upnatoms"
            },
            }, 
            distance = 1.5, 
        })
    end
end

CreateThread(function()
    DecorRegister("t_vehicle", 1)
end)

RegisterNetEvent('qb-upnatoms:client:jobGarage', function(vehicle)
    local vehicle = Config.Vehicle
    local coords = Config.VehicleSpawn
    QBCore.Functions.SpawnVehicle(vehicle, function(veh)
        SetVehicleNumberPlateText(veh, "UPNATOMS"..tostring(math.random(1000, 9999)))
        DecorSetFloat(veh, "t_vehicle", 1)
        SetEntityAsMissionEntity(veh, true, true)
        TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1)
        TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(veh))
        SetVehicleEngineOn(veh, true, true)
        CurrentPlate = QBCore.Functions.GetPlate(veh)
        SetVehicleFuelLevel(veh, 100.0)
    end, coords, true)
end)

RegisterNetEvent('qb-upnatoms:client:storeGarage', function()
    local veh = QBCore.Functions.GetClosestVehicle()
    if DecorExistOn((veh), "t_vehicle") then
        QBCore.Functions.DeleteVehicle(veh)
        QBCore.Functions.Notify("You returned the vehicle.", "success")
    else
        QBCore.Functions.Notify("This is not a work vehicle.", "error")
    end
end)

RegisterNetEvent("qb-upnatoms:client:frontTray1", function()
    TriggerEvent("inventory:client:SetCurrentStash", "foodtray1")
    TriggerServerEvent("inventory:server:OpenInventory", "stash", "foodtray1", {
        maxweight = 10000,
        slots = 5,
    })
end)

RegisterNetEvent("qb-upnatoms:client:frontTray2", function()
    TriggerEvent("inventory:client:SetCurrentStash", "foodtray2")
    TriggerServerEvent("inventory:server:OpenInventory", "stash", "foodtray2", {
        maxweight = 10000,
        slots = 5,
    })
end)

RegisterNetEvent("qb-upnatoms:client:frontTray3", function()
    TriggerEvent("inventory:client:SetCurrentStash", "foodtray3")
    TriggerServerEvent("inventory:server:OpenInventory", "stash", "foodtray3", {
        maxweight = 10000,
        slots = 5,
    })
end)

RegisterNetEvent("qb-upnatoms:client:frontTray4", function()
    TriggerEvent("inventory:client:SetCurrentStash", "foodtray4")
    TriggerServerEvent("inventory:server:OpenInventory", "stash", "foodtray4", {
        maxweight = 10000,
        slots = 5,
    })
end)

RegisterNetEvent("qb-upnatoms:client:jobHeater1", function()
    TriggerEvent("inventory:client:SetCurrentStash", "heater1")
    TriggerServerEvent("inventory:server:OpenInventory", "stash", "heater1", {
        maxweight = 2500000,
        slots = 30,
    })
end)

RegisterNetEvent("qb-upnatoms:client:jobFridge1", function()
    TriggerEvent("inventory:client:SetCurrentStash", "fridge1")
    TriggerServerEvent("inventory:server:OpenInventory", "stash", "fridge1", {
        maxweight = 5000000,
        slots = 50,
    })
end)

RegisterNetEvent("qb-upnatoms:client:ingredientStore", function()
    TriggerServerEvent("inventory:server:OpenInventory", "shop", "upnatoms", Config.Items)
end)

RegisterNetEvent('qb-upnatoms:clientToggleDuty', function()
    TriggerServerEvent("QBCore:ToggleDuty")
end)

RegisterNetEvent("qb-upnatoms:bill", function()
    local bill = exports['qb-input']:ShowInput({
        header = "Cash Register",
		submitText = "Charge",
        inputs = {
            {
                text = "Server ID(#)",
				name = "citizenid", 
                type = "text", 
                isRequired = true --
            },
            {
                text = "   Bill Price ($)",
                name = "billprice", 
                type = "number",
                isRequired = false
            }
			
        }
    })
    if bill ~= nil then
        if bill.citizenid == nil or bill.billprice == nil then 
            return 
        end
        TriggerServerEvent("qb-upnatoms:server:billPlayer", bill.citizenid, bill.billprice)
    end
end)