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

QBCore.Functions.CreateCallback('ss-garage:server:SpawnVehicle', function(source, cb, plate, model, coords)
    local player = QBCore.Functions.GetPlayer(source)
    local vehicle = exports['oxmysql']:fetchSync('SELECT * FROM player_vehicles WHERE citizenid = ? AND plate = ? AND vehicle = ?', {player.PlayerData.citizenid, plate, model})

    if not vehicle[1] then
        TriggerClientEvent('QBCore:Notify', source, 'Du ejer ikke dette køretøj', 'error')
        cb(false)
        return
    end
    if vehicle[1].fakeplate ~= nil and string.len(vehicle[1].fakeplate) > 0 then
        plate = vehicle[1].fakeplate
    end
    if OutsideVehicles[plate] and DoesEntityExist(OutsideVehicles[plate].entity) then
        TriggerClientEvent('QBCore:Notify', source, 'Køretøj er allerede ude', 'error')
        cb(false)
        return
    end

    local veh = QBCore.Functions.SpawnVehicle(source, model, coords, Config.ShouldTeleport)
    SetVehicleNumberPlateText(veh, plate)
    OutsideVehicles[plate] = { netID = NetworkGetNetworkIdFromEntity(veh), entity = veh }
    exports['oxmysql']:execute('UPDATE player_vehicles SET state = ?, depotprice = ? WHERE (plate = ? OR fakeplate = ?)', { 0, 0, plate, plate })
    cb(true, NetworkGetNetworkIdFromEntity(veh), json.decode(vehicle[1].mods), plate, vehicle[1].fuel, vehicle[1].engine, vehicle[1].body)
end)

QBCore.Functions.CreateCallback('qb-garages:server:GetPlayerVehicles', function(source, cb)
    local Player = QBCore.Functions.GetPlayer(source)
    local result = exports['oxmysql']:fetchSync('SELECT * FROM player_vehicles WHERE citizenid = ?', {Player.PlayerData.citizenid})
    
    if result[1] then
        local vehs = FormatVehicles(result)
        cb(vehs)
    else
        cb(nil)
    end
end)

RegisterNetEvent('ss-garage:server:setHouseGarages', function(data)
    Config.Garages = data
end)

QBCore.Functions.CreateCallback('qb-garages:server:canDeposit', function(source, cb, plate, type, garage, state)
    local Player = QBCore.Functions.GetPlayer(source)
    local isOwned = exports['oxmysql']:fetchSync('SELECT * FROM player_vehicles WHERE citizenid = ? AND (plate = ? OR fakeplate = ?)', {Player.PlayerData.citizenid, plate})
    if not isOwned[1] then
        cb(false)
        return
    end
    if type == 'house' and not exports['ps-housing']:IsOwner(source, garage) then
        cb(false)
        return
    end
    if state == 1 then
        exports['oxmysql']:execute('UPDATE player_vehicles SET state = ?, garage = ? WHERE plate = ?', { state, garage, plate })
        cb(true)
    else
        cb(false)
    end
end)

QBCore.Functions.CreateCallback('ss-garage:server:GetVehicles', function(source, cb, garage, type, category)
    local Player = QBCore.Functions.GetPlayer(source)
    local result

    if type == 'depot' then
        result = exports['oxmysql']:fetchSync('SELECT * FROM player_vehicles WHERE citizenid = ? AND depotprice > 0', {Player.PlayerData.citizenid})
    elseif Config.realisticGarage then
        result = exports['oxmysql']:fetchSync('SELECT * FROM player_vehicles WHERE citizenid = ? AND garage = ?', {Player.PlayerData.citizenid, garage})
    else
        result = exports['oxmysql']:fetchSync('SELECT * FROM player_vehicles WHERE citizenid = ?', {Player.PlayerData.citizenid})
    end

    if result[1] then
        local vehs = FormatVehicles(result)
        cb(vehs)
    else
        cb(nil)
    end
end)

RegisterNetEvent('qb-garages:server:updateVehicleStats', function(plate, fuel, engine, body)
    exports['oxmysql']:execute('UPDATE player_vehicles SET fuel = ?, engine = ?, body = ? WHERE plate = ?', { fuel, engine, body, plate })
end)

RegisterNetEvent('qb-garages:server:UpdateOutsideVehicle', function(plate, vehicleNetID)
    OutsideVehicles[plate] = {
        netID = vehicleNetID,
        entity = NetworkGetEntityFromNetworkId(vehicleNetID)
    }
end)

RegisterNetEvent('ss-garage:server:SwapVehicle', function(data)
    local source = source
    local Player = QBCore.Functions.GetPlayer(source)
    local vehicle = exports['oxmysql']:fetchSync('SELECT * FROM player_vehicles WHERE citizenid = ? AND plate = ? AND garage = ?', { Player.PlayerData.citizenid, data.vehicle.plate, data.vehicle.garageindex })
    
    if not Config.Garages[data.garage] then
        TriggerClientEvent('QBCore:Notify', source, 'Garage eksisterer ikke', 'error')
        return
    end

    if not vehicle[1] then
        TriggerClientEvent('QBCore:Notify', source, 'Du ejer ikke dette køretøj', 'error')
        return
    end

    if OutsideVehicles[vehicle[1].plate] and DoesEntityExist(OutsideVehicles[vehicle[1].plate].entity) then
        TriggerClientEvent('QBCore:Notify', source, 'Køretøj er allerede ude', 'error')
        return
    end

    TriggerClientEvent('QBCore:Notify', source, 'Du rykkede dit køretøj til '..data.garage, 'success')
    exports['oxmysql']:execute('UPDATE player_vehicles SET garage = ? WHERE plate = ?', { data.garage, data.vehicle.plate })
end)

RegisterNetEvent('ss-garage:server:TransferVehicle', function(data)
    local source = source
    local Player = QBCore.Functions.GetPlayer(source)
    local vehicle = exports['oxmysql']:fetchSync('SELECT * FROM player_vehicles WHERE citizenid = ? AND plate = ? AND garage = ?', { Player.PlayerData.citizenid, data.vehicle.plate, data.vehicle.garageindex })

    if not vehicle[1] then
        TriggerClientEvent('QBCore:Notify', source, 'Du ejer ikke dette køretøj', 'error')
        return
    end

    if OutsideVehicles[vehicle[1].plate] and DoesEntityExist(OutsideVehicles[vehicle[1].plate].entity) then
        TriggerClientEvent('QBCore:Notify', source, 'Dette køretøj er allerede ude', 'error')
        return
    end

    local target = QBCore.Functions.GetPlayer(tonumber(data.id))

    if not target then
        TriggerClientEvent('QBCore:Notify', source, 'Spilleren er ikke online', 'error')
        return
    end

    TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, 'Du gav dit køretøj til '..target.PlayerData.charinfo.firstname..' '..target.PlayerData.charinfo.lastname, 'success')
    TriggerClientEvent('QBCore:Notify', target.PlayerData.source, 'Du modtog et køretøj fra '..Player.PlayerData.charinfo.firstname..' '..Player.PlayerData.charinfo.lastname, 'success')
    exports['oxmysql']:execute('UPDATE player_vehicles SET citizenid = ?, license = ? WHERE plate = ?', { target.PlayerData.citizenid, target.PlayerData.license, data.vehicle.plate })
end)