local renderingScriptCam = ""
local openUI = false
local SellectMode = ""
local SellectItem = ""
local colorstyp = ""
local oldcolor = 1
local oldcolorextra = 1
local oldplate = 1
local oldneon = 1
local oldwtype = 1
local vehicleMods = {}
local oldtint = 1
local oldsmoke = 1
local SellectItemPrice = 0
local typer = "main"

Citizen.CreateThread(function()
    AddMechanicsBlips()
    while true do
        local sleep = 500
        local playercoord = GetEntityCoords(PlayerPedId())
        for k, v in pairs(Config.Mechanics) do
            local dst = #(playercoord - vector3(v.Coords.x, v.Coords.y, v.Coords.z))
            if dst < Config.Distance and IsPedSittingInAnyVehicle(PlayerPedId()) and returnlogin() and checkJob(k) and not openUI then
                sleep = 1
                DrawText3D(playercoord.x, playercoord.y, playercoord.z, Config.Langs.OpenMenu)
                DrawMarker(36, v.Coords.x, v.Coords.y, v.Coords.z, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, 1.0, 255, 255, 255, 200, 0, 0, 0, 1)
                if IsControlJustPressed(0, 38) then
                    OpenMenu()
                end
            end
        end
        Citizen.Wait(sleep)
    end
end)

function closeHud()
    TriggerServerEvent("hp_hud:server:UpdateData", true)
end

function openHud()
    TriggerServerEvent("hp_hud:server:UpdateData", false)
end

local customCamMain = ""
local customCamSec = ""
function OpenMenu()
    closeHud()--Hide the HP_HUD
    local playerPed = PlayerPedId()
    local playerVeh = GetVehiclePedIsIn(playerPed, false)
    local vehPos = GetEntityCoords(playerVeh)
    local camPos = GetOffsetFromEntityInWorldCoords(playerVeh, -2.0, 5.0, 3.0)
    local headingToObject = GetHeadingFromVector_2d(vehPos.x - camPos.x, vehPos.y - camPos.y)
    SellectItemPrice = 0
    customCamMain = CreateCamWithParams('DEFAULT_SCRIPTED_CAMERA', camPos.x, camPos.y, camPos.z, -35.0, 0.0, headingToObject, GetGameplayCamFov(), false, 2)
    customCamSec = CreateCamWithParams('DEFAULT_SCRIPTED_CAMERA', camPos.x, camPos.y, camPos.z, -35.0, 0.0, headingToObject, GetGameplayCamFov(), false, 2)
    SetCamActive(customCamMain, true)
    RenderScriptCams(true, true, 500, true, true)
    FreezeEntityPosition(playerVeh, true)
    SetVehicleOnGroundProperly(playerVeh)
    DisplayHud(false)
    renderingScriptCam = true
    SetNuiFocus(1, 1)
    oldcolor = table.pack(GetVehicleColours(playerVeh))
    oldcolorextra = table.pack(GetVehicleExtraColours(playerVeh))
    FillVehicleModStatus(playerVeh)
    oldwtype = GetVehicleWheelType(playerVeh)
    oldsmoke = table.pack(GetVehicleTyreSmokeColor(playerVeh))
    oldneon = table.pack(GetVehicleNeonLightsColour(playerVeh))
    oldplate = GetVehicleNumberPlateTextIndex(playerVeh)
    oldtint = GetVehicleWindowTint(playerVeh)
    detailed(playerVeh)
    openUI = true
    SendNUIMessage({
        action = "openmenu"
    })
    ToggleVehicleParts("allclosed")
    AddMods()
    UpdatePrice()
end

function AddMods()
    local playerPed = PlayerPedId()
    local playerVeh = GetVehiclePedIsIn(playerPed, false)
    SetVehicleModKit(playerVeh, 0)
    for k, v in pairs(Config.ModsList) do
        if Config.DetailMods[k] == nil then
            SendNUIMessage({
                action = "addMods",
                label = v.name,
                img = v.img,
                id = k,
            })
        else
            local modCount = GetNumVehicleMods(playerVeh, Config.DetailMods[k].modtype)
            if modCount > 1 then
                SendNUIMessage({
                    action = "addMods",
                    label = Config.ModsList[k].name,
                    img = Config.ModsList[k].img,
                    id = k,
                })
            end
        end
    end
end

function detailed(veh)
    local pmult, tmult, handling, brake = 1000, 800, GetPerformanceStats(veh).handling, GetPerformanceStats(veh).brakes
    topspeed = math.ceil(GetVehicleModelEstimatedMaxSpeed(GetEntityModel(veh)) * 3.6)
    power = math.ceil(GetVehicleModelAcceleration(GetEntityModel(veh)) * pmult)
    torque = math.ceil(GetVehicleModelAcceleration(GetEntityModel(veh)) * tmult)
    brakes = GetVehicleModelMaxBraking(GetEntityModel(veh)) * 80
    health = math.floor(GetVehicleEngineHealth(veh) / 10)
    fuel = getfuel(veh)
    SendNUIMessage({
        action = "update",
        topspeed = topspeed,
        power = power,
        torque = torque,
        brakes = brakes,
        health = health,
        fuel = fuel
    })
end

function GetPerformanceStats(vehicle)
    local data = {}
    data.brakes = GetVehicleModelMaxBraking(vehicle)
    local handling1 = GetVehicleModelMaxBraking(vehicle)
    local handling2 = GetVehicleModelMaxBrakingMaxMods(vehicle)
    local handling3 = GetVehicleModelMaxTraction(vehicle)
    data.handling = (handling1 + handling2) * handling3
    return data
end

function toboolean(str, str2)
    local bool = false
    if all_trim(str) == all_trim(str2) then
        bool = true
    end
    return bool
end

function all_trim(s)
    str = s:gsub("%s+", "")
    str = string.gsub(s, "%s+", "")
    return str
end

RegisterNUICallback("close", function()
    typerChange()
end)

RegisterNUICallback('rightClick', function(data, cb)
    SetNuiFocus(false, false)
    RenderScriptCams(false, true, 500, true, true)
    renderingScriptCam = false
    DestroyCam(customCamMain, true)
    DestroyCam(customCamSec, true)
    ClearFocus()
    while true do
        Citizen.Wait(1)
        if IsDisabledControlJustPressed(0, 91) or not openUI then
            break
        end
    end
    
    SetNuiFocus(true, true)
    cb("")
end)

RegisterNUICallback("changecam", function()
    local playerVeh = GetVehiclePedIsIn(PlayerPedId(), false)
    local vehPos = GetEntityCoords(playerVeh)
    local camPos = GetOffsetFromEntityInWorldCoords(playerVeh, -2.0, 5.0, 3.0)
    local headingToObject = GetHeadingFromVector_2d(vehPos.x - camPos.x, vehPos.y - camPos.y)
    customCamMain = CreateCamWithParams('DEFAULT_SCRIPTED_CAMERA', camPos.x, camPos.y, camPos.z, -35.0, 0.0, headingToObject, GetGameplayCamFov(), false, 2)
    customCamSec = CreateCamWithParams('DEFAULT_SCRIPTED_CAMERA', camPos.x, camPos.y, camPos.z, -35.0, 0.0, headingToObject, GetGameplayCamFov(), false, 2)
    SetCamActive(customCamMain, true)
    RenderScriptCams(true, true, 500, true, true)
    FreezeEntityPosition(playerVeh, true)
    SetVehicleOnGroundProperly(playerVeh)
    RenderScriptCams(not renderingScriptCam, true, 500, true, true)
    renderingScriptCam = not renderingScriptCam
end)

RegisterNUICallback("SellectId", function(data)
    id = data.id
    SellectMode = id
    SendNUIMessage({action = "emptyitem"})
    typer = "main"
    CehckCarParts()
    if Config.SoundEffect then
        PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1)
    end
    DefaultCar()
    if id == "Colors" then
        SendNUIMessage({action = "emptyall"})
        for k, v in pairs(Config.ColorsType) do
            typer = "alt"
            SendNUIMessage({
                action = "addMods",
                label = v.label,
                img = v.img,
                id = k,
            })
        end
    elseif id == "Plates" then
        for k, v in pairs(Config.Plates) do
            select = false
            if v.plateindex == oldplate then
                select = true
            end
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = v.img,
                price = v.price,
                id = k,
                select = select,
            })
        end
    elseif id == "Horns" then
        for k, v in pairs(Config.Horns) do
            select = false
            if v.mod == GetModStatus(14) then
                select = true
            end
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ModsList["Horns"].img,
                price = v.price,
                id = k,
                select = select,
            })
        end
    elseif id == "PrimaryColor" or id == "SecondaryColor" or id == "PearlColor" then
        colorstyp = id
        typer = "altalt"
        SendNUIMessage({action = "emptyall"})
        for k, v in pairs(Config.ColorsMenu) do
            SendNUIMessage({
                action = "addMods",
                label = v.label,
                img = v.img,
                id = k,
            })
        end
    elseif id == "ColorsC" then
        typer = "altaltalt"
        for k, v in pairs(Config.Colors) do
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ColorsMenu["ColorsC"].img,
                price = Config.ColorsMenu["ColorsC"].price,
                id = k,
            })
        end
    elseif id == "MetalColors" then
        typer = "altaltalt"
        for k, v in pairs(Config.MetalColors) do
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ColorsMenu["MetalColors"].img,
                price = Config.ColorsMenu["MetalColors"].price,
                id = k,
            })
        end
    elseif id == "MatteColors" then
        typer = "altaltalt"
        for k, v in pairs(Config.MatteColors) do
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ColorsMenu["MatteColors"].img,
                price = Config.ColorsMenu["MatteColors"].price,
                id = k,
            })
        end
    elseif id == "Xenons" then -- Xenon
        typer = "main"
        SendNUIMessage({action = "emptyall"})
        for k, v in pairs(Config.LightsTypes) do
            typer = "alt"
            SendNUIMessage({
                action = "addMods",
                label = v.label,
                img = v.img,
                id = k,
            })
        end
    elseif id == "LightsType" then
        typer = "alt"
        for k, v in pairs(Config.LightsType) do
            select = false
            if v.mod == GetModStatus(22) or (GetModStatus(22) == -1 and v.mod == 0) then
                select = true
            end
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ModsList.Xenons.img,
                price = v.price,
                id = k,
                select = select,
            })
        end
    elseif id == "LightsColors" then
        typer = "alt"
        for k, v in pairs(Config.LightsColors) do
            select = false
            if v.light == oldheadlights then
                select = true
            end
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.LightsTypes["LightsType"].img,
                price = v.price,
                id = k,
                select = select
            })
        end
    elseif id == "RepairMenu" then
        for k, v in pairs(Config.RepairMenu) do
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = v.img,
                price = v.price,
                id = k,
            })
        end
    elseif id == "Neons" then
        for k, v in pairs(Config.Neons) do
            select = false
            if json.encode(v.neon) == "[" .. oldneon[1] .. "," .. oldneon[2] .. "," .. oldneon[3] .. "]" then
                select = true
            end
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ModsList["Neons"].img,
                price = v.price,
                id = k,
                select = select,
            })
        end
    elseif id == "WindowTint" then
        for k, v in pairs(Config.Windowtint) do
            select = false
            if v.tint == oldtint or (oldtint == -1 and v.tint == 4) then
                select = true
            end
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ModsList["WindowTint"].img,
                price = v.price,
                id = k,
                select = select,
            })
        end
    elseif id == "Suspension" then
        for k, v in pairs(Config.Suspensions) do
            select = false
            if v.mod == GetModStatus(15) or (GetModStatus(15) == -1 and v.mod == 0) then
                select = true
            end
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ModsList["Suspension"].img,
                price = v.price,
                id = k,
                select = select,
            })
        end
    elseif id == "Brakes" then
        for k, v in pairs(Config.Brakes) do
            select = false
            if v.mod == GetModStatus(12) or (GetModStatus(12) == -1 and v.mod == 0) then
                select = true
            end
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ModsList["Brakes"].img,
                price = v.price,
                id = k,
                select = select,
            })
        end
    elseif id == "Engine" then
        for k, v in pairs(Config.Engine) do
            select = false
            if v.mod == GetModStatus(11) or (GetModStatus(11) == 3 and v.mod == 0) or (GetModStatus(11) == -1 and v.mod == 0) then
                select = true
            end
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ModsList["Engine"].img,
                price = v.price,
                id = k,
                select = select,
            })
        end
    elseif id == "Turbo" then
        for k, v in pairs(Config.Turbo) do
            select = false
            if v.mod == GetModStatus(18) or (GetModStatus(18) == -1 and v.mod == 0) then
                select = true
            end
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ModsList["Turbo"].img,
                price = v.price,
                id = k,
                select = select,
            })
        end
    elseif id == "Transmission" then
        for k, v in pairs(Config.Transmission) do
            select = false
            if v.mod == GetModStatus(13) or (GetModStatus(13) == -1 and v.mod == 0) then
                select = true
            end
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ModsList["Transmission"].img,
                price = v.price,
                id = k,
                select = select,
            })
        end
    elseif id == "Wheels" then
        typer = "main"
        SendNUIMessage({action = "emptyall"})
        for k, v in pairs(Config.WheelsType) do
            typer = "alt"
            SendNUIMessage({
                action = "addMods",
                label = v.name,
                img = v.img,
                id = k,
            })
        end
    elseif id == "wheelSmoke" then
        typer = "alt"
        for k, v in pairs(Config.Wheel.wheelaccessories) do
            select = false
            if json.encode(v.smokecolor) == "[" .. oldsmoke[1] .. "," .. oldsmoke[2] .. "," .. oldsmoke[3] .. "]" then
                select = true
            end
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ModsList["Wheels"].img,
                price = v.price,
                id = k,
                select = select,
            })
        end
    elseif id == "accessories" then
        typer = "alt"
        SendNUIMessage({action = "emptyall"})
        for k, v in pairs(Config.Wheel_whType) do
            typer = "altalt"
            SendNUIMessage({
                action = "addMods",
                label = v.name,
                img = v.img,
                id = k,
            })
        end
    elseif id == "frontwheel" or id == "backwheel" or id == "sportwheels" or id == "suvwheels" or id == "offroadwheels" or id == "tunerwheels" or id == "highendwheels" or id == "lowriderwheels" or id == "musclewheels" then
        typer = "altalt"
        for k, v in pairs(Config.Wheel.Wheel[id]) do
            select = false
            if v.mod == GetModStatus(23) and v.wtype == oldwtype then
                select = true
            end
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.Wheel_whType[id].img,
                price = v.price,
                id = k,
                select = select,
            })
        end
    elseif id == "wheelcolor" then
        typer = "alt"
        for k, v in pairs(Config.Colors) do
            SendNUIMessage({
                action = "addItems",
                label = v.name,
                img = Config.ColorsMenu["ColorsC"].img,
                price = Config.ColorsMenu["ColorsC"].price,
                id = k,
            })
        end
    elseif Config.DetailMods[id] then
        local playerPed = PlayerPedId()
        local playerVeh = GetVehiclePedIsIn(playerPed, false)
        local modCount = GetNumVehicleMods(playerVeh, Config.DetailMods[id].modtype)
        for i = modCount, 0, -1 do
            select = false
            if i == GetModStatus(Config.DetailMods[id].modtype) or (GetModStatus(Config.DetailMods[id].modtype) == -1 and i == modCount) then
                select = true
            end
            if i == modCount then
                else
                SendNUIMessage({
                    action = "addItems",
                    label = Config.ModsList[id].name .. " " .. i + 1,
                    img = Config.ModsList[id].img,
                    price = Config.DetailMods[id].startprice + (i * Config.DetailMods[id].increaseby),
                    select = select,
                    id = i,
                })
            end
        end
        select = false
        if modCount == GetModStatus(Config.DetailMods[id].modtype) or (GetModStatus(Config.DetailMods[id].modtype) == -1) then
            select = true
        end
        SendNUIMessage({
            action = "addItems",
            label = Config.ModsList[id].name .. " " .. Config.Langs["Stock"],
            img = Config.ModsList[id].img,
            price = Config.DetailMods[id].startprice + (modCount * Config.DetailMods[id].increaseby),
            select = select,
            id = modCount,
        })
    -- end
    end
end)

BlipsTable = {}
function AddMechanicsBlips()
    for location, data in pairs(Config.Mechanics) do
        if data.Job == "unjob" or data.Job == "mechanic" then
            local blip = AddBlipForCoord(data.Coords.x, data.Coords.y, data.Coords.z)
            SetBlipSprite(blip, Config.Blips.sprite)
            SetBlipDisplay(blip, 4)
            SetBlipScale(blip, Config.Blips.scale)
            SetBlipColour(blip, Config.Blips.color)
            SetBlipAsShortRange(blip, true)
            BeginTextCommandSetBlipName("STRING")
            AddTextComponentString(Config.Blips.Name)
            EndTextCommandSetBlipName(blip)
            table.insert(BlipsTable, blip)
        end
    end
end

RegisterNUICallback("SellectItem", function(data)
    id = data.id
    SellectItem = id
    local playerPed = PlayerPedId()
    local playerVeh = GetVehiclePedIsIn(playerPed, false)
    oldcolorx = table.pack(GetVehicleColours(playerVeh))
    repair = "no"
    if Config.SoundEffect then
        PlaySoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", 1)
    end
    if SellectMode == "MatteColors" or SellectMode == "MetalColors" or SellectMode == "ColorsC" then
        if colorstyp == "PrimaryColor" then
            if SellectMode == "ColorsC" then
                SellectItemPrice = Config.ColorsMenu["ColorsC"].price
                SetVehicleColours(playerVeh, Config["Colors"][tonumber(SellectItem)].colorindex, oldcolor[2])
            else
                SellectItemPrice = Config.ColorsMenu[SellectMode].price
                SetVehicleColours(playerVeh, Config[SellectMode][tonumber(SellectItem)].colorindex, oldcolor[2])
            end
        elseif colorstyp == "SecondaryColor" then
            if SellectMode == "ColorsC" then
                SellectItemPrice = Config.ColorsMenu["ColorsC"].price
                SetVehicleColours(playerVeh, oldcolorx[1], Config["Colors"][tonumber(SellectItem)].colorindex)
            else
                SellectItemPrice = Config.ColorsMenu[SellectMode].price
                SetVehicleColours(playerVeh, oldcolorx[1], Config[SellectMode][tonumber(SellectItem)].colorindex)
            end
        else
            if SellectMode == "ColorsC" then
                SellectItemPrice = Config.ColorsMenu["ColorsC"].price
                SetVehicleExtraColours(playerVeh, Config["Colors"][tonumber(SellectItem)].colorindex, Config["Colors"][tonumber(SellectItem)].colorindex)
            else
                SellectItemPrice = Config.ColorsMenu[SellectMode].price
                SetVehicleExtraColours(playerVeh, Config[SellectMode][tonumber(SellectItem)].colorindex, Config[SellectMode][tonumber(SellectItem)].colorindex)
            end
        end
    elseif SellectMode == "Horns" then
        SellectItemPrice = Config.Horns[tonumber(id)].price
        SetVehicleMod(playerVeh, 14, Config.Horns[tonumber(id)].mod)
        OverrideVehHorn(playerVeh, false, Config.Horns[tonumber(id)].mod)
        StartVehicleHorn(playerVeh, 3000, GetHashKey("HELDDOWN"), true)
        notify(Config.Langs["ChangeHorns"])
    elseif SellectItem == "Repair" or SellectItem == "AdvancedRepair" or SellectItem == "Clean" then
        SellectItemPrice = Config.RepairMenu[SellectItem].price
    elseif SellectMode == "Plates" then
        SellectItemPrice = Config.Plates[tonumber(id)].price
        SetVehicleNumberPlateTextIndex(playerVeh, Config.Plates[tonumber(id)].plateindex)
    elseif SellectMode == "Neons" then
        SellectItemPrice = Config.Neons[tonumber(id)].price
        for i = 0, 3 do
            SetVehicleNeonLightEnabled(playerVeh, i, true)
        end
        if json.encode(Config.Neons[tonumber(id)].neon) == "[0,0,0]" then
            SetVehicleNeonLightsColour(playerVeh, 255, 255, 255)
            for i = 0, 3 do
                SetVehicleNeonLightEnabled(playerVeh, i, false)
            end
        else
            SetVehicleNeonLightsColour(playerVeh, Config.Neons[tonumber(id)].neon[1], Config.Neons[tonumber(id)].neon[2], Config.Neons[tonumber(id)].neon[3])
        end
    elseif SellectMode == "WindowTint" then
        SellectItemPrice = Config.Windowtint[tonumber(id)].price
        SetVehicleWindowTint(playerVeh, Config.Windowtint[tonumber(id)].tint)
    elseif SellectMode == "Suspension" then
        SellectItemPrice = Config.Suspensions[tonumber(id)].price
        SetVehicleMod(playerVeh, 15, Config.Suspensions[tonumber(id)].mod)
    elseif SellectMode == "Brakes" then
        SellectItemPrice = Config.Brakes[tonumber(id)].price
        SetVehicleMod(playerVeh, 12, Config.Brakes[tonumber(id)].mod)
    elseif SellectMode == "Engine" then
        SellectItemPrice = Config.Engine[tonumber(id)].price
        SetVehicleMod(playerVeh, 11, Config.Engine[tonumber(id)].mod)
    elseif SellectMode == "Turbo" then
        SellectItemPrice = Config.Turbo[tonumber(id)].price
        ToggleVehicleMod(playerVeh, 18, Config.Turbo[tonumber(id)].enabled)
    elseif SellectMode == "LightsType" then
        SellectItemPrice = Config.LightsType[tonumber(id)].price
        ToggleVehicleMod(playerVeh, 22, Config.LightsType[tonumber(id)].enabled)
    elseif SellectMode == "LightsColors" then
        SellectItemPrice = Config.LightsColors[tonumber(id)].price
        SetVehicleXenonLightsColor(playerVeh, Config.LightsColors[tonumber(id)].light)
    elseif SellectMode == "Transmission" then
        SellectItemPrice = Config.Transmission[tonumber(id)].price
        SetVehicleMod(playerVeh, 13, Config.Transmission[tonumber(id)].mod)
    elseif SellectMode == "wheelSmoke" then
        SellectItemPrice = Config.Wheel.wheelaccessories[tonumber(id)].price
        ToggleVehicleMod(playerVeh, 20, true)
        SetVehicleTyreSmokeColor(playerVeh, Config.Wheel.wheelaccessories[tonumber(id)].smokecolor[1], Config.Wheel.wheelaccessories[tonumber(id)].smokecolor[2], Config.Wheel.wheelaccessories[tonumber(id)].smokecolor[3])
    elseif SellectMode == "frontwheel" or SellectMode == "backwheel" or SellectMode == "sportwheels" or SellectMode == "suvwheels" or SellectMode == "offroadwheels" or SellectMode == "tunerwheels" or SellectMode == "highendwheels" or SellectMode == "lowriderwheels" or SellectMode == "musclewheels" then
        SellectItemPrice = Config.Wheel.Wheel[SellectMode][tonumber(id)].price
        SetVehicleWheelType(playerVeh, Config.Wheel.Wheel[SellectMode][tonumber(id)].wtype)
        SetVehicleMod(playerVeh, 23, Config.Wheel.Wheel[SellectMode][tonumber(id)].mod)
    elseif Config.DetailMods[SellectMode] then
        SellectItemPrice = Config.DetailMods[SellectMode].startprice + (tonumber(id) * Config.DetailMods[SellectMode].increaseby)
        SetVehicleMod(playerVeh, Config.DetailMods[SellectMode].modtype, tonumber(id))
    end
    UpdatePrice()
end)

RegisterNUICallback("BuyItem", function()
    TriggerServerEvent("hp_mechanic:buyitem", SellectItemPrice)
end)

RegisterNetEvent("hp_mechanic:cl:buyitem")
AddEventHandler("hp_mechanic:cl:buyitem", function()
    local playerPed = PlayerPedId()
    local playerVeh = GetVehiclePedIsIn(playerPed, false)
    if Config.SoundEffect then
        SendNUIMessage({action = "sound"})
    end
    if SellectItem == "Repair" then
        local fullEngineHealth = 1000.0
        SetVehicleEngineHealth(playerVeh, fullEngineHealth)
        detailed(playerVeh)
        notify(Config.Langs["Repair"])
    elseif SellectItem == "AdvancedRepair" then
        local fullEngineHealth = 1000.0
        SetVehicleEngineHealth(playerVeh, fullEngineHealth)
        SetVehicleFixed(playerVeh)
        detailed(playerVeh)
        notify(Config.Langs["AdvancedRepair"])
    elseif SellectItem == "Clean" then
        notify(Config.Langs["Clean"])
        WashDecalsFromVehicle(playerVeh, 1.0)
        SetVehicleDirtLevel(playerVeh)
    else
        SaveCar()
    end
    TriggerServerEvent("hp_mechanic:SaveVehicleProps", getvehiclepropx(playerVeh))
end)

function UpdatePrice()
    SendNUIMessage({
        action = "updateprice",
        price = SellectItemPrice
    })
end

local PartsAll = {
    ["Trim"] = true,
    ["DoorSpeaker"] = true,
    ["Seats"] = true,
    ["Trunk"] = true,
    ["Hydraulics"] = true,
    ["EngineBlock"] = true,
    ["AirFilter"] = true,
    ["Struts"] = true,
}

function CehckCarParts()
    ToggleVehicleParts("allclosed")
    if PartsAll[SellectMode] == nil then else
        ToggleVehicleParts("doors")
    end
end

function ToggleVehicleParts(typ)
    local playerPed = PlayerPedId()
    local playerVeh = GetVehiclePedIsIn(playerPed, false)
    if typ == "doors" then
        for i = 0, 5 do
            SetVehicleDoorOpen(playerVeh, i, false, false)
        end
    elseif typ == "allclosed" then
        for i = 0, 5 do
            SetVehicleDoorShut(playerVeh, i, false)
        end
    end
end

function DefaultCar()
    local playerPed = PlayerPedId()
    local playerVeh = GetVehiclePedIsIn(playerPed, false)
    SetVehicleColours(playerVeh, oldcolor[1], oldcolor[2])
    SetVehicleNeonLightsColour(playerVeh, oldneon[1], oldneon[2], oldneon[3])
    SetVehicleNumberPlateTextIndex(playerVeh, oldplate)
    SetVehicleExtraColours(playerVeh, oldcolorextra[1], oldcolorextra[2])
    SetVehicleWindowTint(playerVeh, oldtint)
    SetVehicleWheelType(playerVeh, oldwtype)
    SaveAllMod(playerVeh)
    SetVehicleTyreSmokeColor(playerVeh, oldsmoke[1], oldsmoke[2], oldsmoke[3])
end

function SaveCar()
    local playerPed = PlayerPedId()
    local playerVeh = GetVehiclePedIsIn(playerPed, false)
    oldcolor = table.pack(GetVehicleColours(playerVeh))
    oldcolorextra = table.pack(GetVehicleExtraColours(playerVeh))
    oldneon = table.pack(GetVehicleNeonLightsColour(playerVeh))
    oldheadlights = IsToggleModOn(playerVeh, 22)
    oldxenon = GetVehicleXenonLightsColor(playerVeh)
    oldplate = GetVehicleNumberPlateTextIndex(playerVeh)
    oldtint = GetVehicleWindowTint(playerVeh)
    oldwtype = GetVehicleWheelType(playerVeh)
    oldsmoke = table.pack(GetVehicleTyreSmokeColor(playerVeh))
    oldTurbo = IsToggleModOn(playerVeh, 18)
    notify(Config.Langs["BuyItem"])
    SetVehicleNumberPlateTextIndex(playerVeh, oldplate)
    SetVehicleNeonLightsColour(playerVeh, oldneon[1], oldneon[2], oldneon[3])
    SetVehicleWheelType(playerVeh, oldwtype)
    FillVehicleModStatus(playerVeh)
    SaveAllMod(playerVeh)
    ToggleVehicleMod(playerVeh, 22, oldheadlights)
    ToggleVehicleMod(playerVeh, 18, oldTurbo)
    SetVehicleHeadlightsColour(playerVeh, oldxenon)
    SetVehicleColours(playerVeh, oldcolor[1], oldcolor[2])
    SetVehicleExtraColours(playerVeh, oldcolorextra[1], oldcolorextra[2])
    SetVehicleWindowTint(playerVeh, oldtint)
    SetVehicleTyreSmokeColor(playerVeh, oldsmoke[1], oldsmoke[2], oldsmoke[3])
end


function closeMenu()
    SetNuiFocus(0, 0)
    local playerPed = PlayerPedId()
    local playerVeh = GetVehiclePedIsIn(playerPed, false)
    FreezeEntityPosition(playerVeh, false)
    RenderScriptCams(false, true, 500, true, true)
    renderingScriptCam = false
    DestroyCam(customCamMain, true)
    DestroyCam(customCamSec, true)
    DisplayHud(true)
    openHud()
    ClearFocus()
    openUI = false
    SendNUIMessage({
        action = "close"
    })
    ToggleVehicleParts("allclosed")
    DefaultCar()
end

function altMenu()
    DefaultCar()
    if SellectMode == "Colors" then
        local playerPed = PlayerPedId()
        local playerVeh = GetVehiclePedIsIn(playerPed, false)
        ClearFocus()
        SendNUIMessage({
            action = "close"
        })
        SetVehicleOnGroundProperly(playerVeh)
        oldcolor = table.pack(GetVehicleColours(playerVeh))
        oldcolorextra = table.pack(GetVehicleExtraColours(playerVeh))
        detailed(playerVeh)
        DefaultCar()
        SendNUIMessage({
            action = "openmenu"
        })
        AddMods()
    elseif SellectMode == "PrimaryColor" or SellectMode == "SecondaryColor" or SellectMode == "PearlColor" then
        SellectMode = "Colors"
        typer = "main"
        local playerPed = PlayerPedId()
        local playerVeh = GetVehiclePedIsIn(playerPed, false)
        ClearFocus()
        SendNUIMessage({
            action = "close"
        })
        SetVehicleOnGroundProperly(playerVeh)
        oldcolor = table.pack(GetVehicleColours(playerVeh))
        oldcolorextra = table.pack(GetVehicleExtraColours(playerVeh))
        detailed(playerVeh)
        DefaultCar()
        SendNUIMessage({
            action = "openmenu"
        })
        AddMods()
    elseif SellectMode == "MetalColors" or SellectMode == "MatteColors" or SellectMode == "ColorsC" then
        colorstyp = id
        typer = "altalt"
        SellectMode = "PrimaryColor"
        SendNUIMessage({action = "emptyall"})
        SendNUIMessage({action = "emptyitem"})
        for k, v in pairs(Config.ColorsType) do
            SendNUIMessage({
                action = "addMods",
                label = v.label,
                img = v.img,
                id = k,
            })
        end
    elseif SellectMode == "frontwheel" or SellectMode == "backwheel" or SellectMode == "sportwheels" or SellectMode == "suvwheels" or SellectMode == "offroadwheels" or id == "tunerwheels" or id == "highendwheels" or SellectMode == "lowriderwheels" or SellectMode == "musclewheels" or SellectMode == "wheelSmoke" or SellectMode == "Wheels" or SellectMode == "accessories" then
        if SellectMode == "wheelSmoke" or SellectMode == "Wheels" then
            typer = "main"
            local playerPed = PlayerPedId()
            local playerVeh = GetVehiclePedIsIn(playerPed, false)
            ClearFocus()
            SendNUIMessage({
                action = "close"
            })
            SetVehicleOnGroundProperly(playerVeh)
            oldcolor = table.pack(GetVehicleColours(playerVeh))
            oldcolorextra = table.pack(GetVehicleExtraColours(playerVeh))
            detailed(playerVeh)
            DefaultCar()
            SendNUIMessage({
                action = "openmenu"
            })
            AddMods()
        elseif SellectMode == "backwheel" or SellectMode == "sportwheels" or SellectMode == "suvwheels" or SellectMode == "offroadwheels" or id == "tunerwheels" or id == "highendwheels" or SellectMode == "lowriderwheels" or SellectMode == "musclewheels" or SellectMode == "accessories" then
            typer = "alt"
            SellectMode = "Wheels"
            SendNUIMessage({action = "emptyitem"})
            SendNUIMessage({action = "emptyall"})
            for k, v in pairs(Config.WheelsType) do
                SendNUIMessage({
                    action = "addMods",
                    label = v.name,
                    img = v.img,
                    id = k,
                })
            end
        end
    elseif SellectMode == "Xenons" or SellectMode == "LightsType" or SellectMode == "LightsColors" then
        if SellectMode == "LightsType" or SellectMode == "LightsColors" then
            typer = "main"
            local playerPed = PlayerPedId()
            local playerVeh = GetVehiclePedIsIn(playerPed, false)
            ClearFocus()
            SendNUIMessage({
                action = "close"
            })
            SetVehicleOnGroundProperly(playerVeh)
            DefaultCar()
            SendNUIMessage({
                action = "openmenu"
            })
            AddMods()
        end
    end
end

function FillVehicleModStatus(veh)
    vehicleMods = {}
    for modType = 0, 49 do
        local modStatus = GetVehicleMod(veh, modType)
        vehicleMods[modType] = modStatus
    end
end

function GetModStatus(modType)
    return vehicleMods[modType]
end

function SaveAllMod(veh)
    for modType, modStatus in pairs(vehicleMods) do
        SetVehicleMod(veh, modType, modStatus)
    end
end

function typerChange()
    if typer == "main" then
        closeMenu()
    elseif typer == "alt" then
        typer = "main"
        altMenu()
    elseif typer == "altalt" then
        typer = "alt"
        altMenu()
    elseif typer == "altaltalt" then
        typer = "altalt"
        altMenu()
    end
end

Citizen.CreateThread(function()
    while true do
        Citizen.Wait(0)
        
        if openUI then
            DisableAllControlActions(0)
            EnableControlAction(0, 1, true)
            EnableControlAction(0, 2, true)
            EnableControlAction(0, 4, true)
            EnableControlAction(0, 6, true)
            EnableControlAction(0, 86, true)
        else
            Citizen.Wait(500)
        end
    end
end)