-- ==================================================================================== --
--                               RoadToSix ( orignal Creator )
--                               Dachlatti ( ESX to QBCore )             
-- ==================================================================================== --
QBCore.Functions.CreateCallback('roadphone:getItemAmount', function(source, cb)
    local hasItem = nil
    if Config.NeedItem then
        if #Config.Items == 0 then
            cb(nil)
            return
        end
        local xPlayer = QBCore.Functions.GetPlayer(source)
        if not xPlayer then
            return;
        end
        for i = 1, #Config.Items, 1 do
            if Config.codeMInventory then
                local hasItem = exports['codem-inventory']:HasItem(source, Config.Items[i], 1)
                if hasItem then
                    cb(Config.Items[i])
                    return
                end
            else
                local items = xPlayer.Functions.GetItemByName(Config.Items[i])
                if items and items.count ~= 0 then
                    hasItem = items.name
                    cb(hasItem)
                    return
                end
            end
        end
        cb(nil)
    else
        cb(true)
    end
end)
QBCore.Functions.CreateCallback('roadphone:getRadioAmount', function(source, cb)
    if Config.RadioNeedItem then
        if #Config.RadioItems == 0 then
            cb(nil)
            return
        end
        local xPlayer = QBCore.Functions.GetPlayer(source)
        if not xPlayer then
            return;
        end
        for i = 1, #Config.RadioItems, 1 do
            if Config.codeMInventory then
                local hasItem = exports['codem-inventory']:HasItem(source, Config.RadioItems[i], 1)
                if hasItem then
                    cb(true)
                    return
                end
            else
                local items = xPlayer.Functions.GetItemByName(Config.RadioItems[i])
                if not items then
                    print("Error: Item " .. Config.RadioItems[i] ..
                              " not found in database. Please add this item in your database.")
                    cb(nil)
                    return
                end
                if items.count ~= 0 then
                    cb(true)
                    return
                end
            end
        end
        cb(nil)
    else
        cb(true)
    end
end)
function getPhoneRandomNumber()
    local numBase = math.random(1000000, 9999999)
    return string.format("%07d", numBase)
end
CreateThread(function()
    for i = 1, #Config.Items do
        QBCore.Functions.CreateUseableItem(Config.Items[i], function(source)
            TriggerClientEvent('roadphone:use', source)
        end)
    end
end)
RegisterCommand('fixphone', function(source)
    TriggerEvent('roadphone:playerLoad', source)
end)
function GetPlayerFromPhone(number)
    local identifier = MySQL.Sync.fetchScalar('SELECT citizenid FROM ' .. Config.UserTable ..
                                                  ' WHERE phone_number = @phone_number', {
        ['@phone_number'] = number
    })
    return QBCore.Functions.GetPlayerByCitizenId(identifier)
end
function getJobName(identifier)
    local xPlayer = QBCore.Functions.GetPlayerByCitizenId(identifier)
    if xPlayer then
        return xPlayer.job.name        
    end
    return nil
end
function getNumberFromIdentifier(identifier)
    local phone_number = MySQL.Sync.fetchScalar('SELECT phone_number FROM ' .. Config.UserTable ..
                                                    ' WHERE citizenid = @identifier', {
        ['@identifier'] = identifier
    })
    return phone_number
end
function getIdentifierFromNumber(number)
    local identifier = MySQL.Sync.fetchScalar('SELECT citizenid FROM ' .. Config.UserTable ..
                                                  ' WHERE phone_number = @phone_number', {
        ['@phone_number'] = number
    })
    return identifier
end
function getNameFromIdentifier(identifier)
    local xPlayer = QBCore.Functions.GetPlayerByCitizenId(identifier)
    if xPlayer then
        return xPlayer.PlayerData.charinfo.firstname .. ' ' .. xPlayer.PlayerData.charinfo.lastname        
    end
    return nil
end
function getPlayersByJob(job)
    local players = {}
    for k, playerId in pairs(QBCore.Functions.GetPlayers()) do
        local Player = QBCore.Functions.GetPlayer(playerId)
        if Player and Player.PlayerData.job.name == job then
            table.insert(players, {
                id = Player.PlayerData.source
            })
        end
    end
    return players
end
RegisterNetEvent('roadphone:sendDispatch')
AddEventHandler('roadphone:sendDispatch', function(source, message, job, coords, anonym, image)
    local _source = tonumber(source)
    local xPlayer = QBCore.Functions.GetPlayer(_source)
    if not job or not message then
        return
    end
    if xPlayer then
        local myPhone = getNumberFromIdentifier(xPlayer.PlayerData.citizenid)
        local targets = getPlayersByJob(job)
        if #targets == 0 then
            TriggerClientEvent('roadphone:sendOffNotification', _source, Lang:t('info.no_dispatchers'))
            return
        end
        if not coords then
            coords = GetEntityCoords(GetPlayerPed(_source))
        end
        local targetmessage = addServiceDispatch(myPhone, job, message, 0, 0, image, coords)
        local mymessage = addServiceDispatch(job, myPhone, message, 1, 1, image, coords)
        for _, target in ipairs(targets) do
            TriggerClientEvent("roadphone:service:receiveMessage:job", target.id, targetmessage, 0)
        end
        TriggerClientEvent("roadphone:service:receiveMessage", _source, mymessage, 1)
        discordLog("15158332", "Service", 'Number: ' .. myPhone .. '\n' .. 'Message: ' .. message .. '\n' .. 'Received Job: ' .. job, "RoadPhone", nil, Cfg.ServiceWebhook, "Service")
    end
end)
RegisterCommand("waveverify", function(source, args)
    local src = source
    if #args < 2 then
        TriggerClientEvent('roadphone:sendOffNotification', src, Lang:t('info.command_required_information'))
        return
    end
    local auth = args[1]
    table.remove(args, 1)
    local label = table.concat(args, ' ')
    local verifyValue = auth == "true" and 1 or 0
    local query =
        "UPDATE `roadshop_tweetwave_accounts` SET `verify`= @verifyValue WHERE roadshop_tweetwave_accounts.username = @username"
    MySQL.Async.execute(query, {
        ['@verifyValue'] = verifyValue,
        ['@username'] = label
    }, function(result)
        if (result == 1) then
            local message = verifyValue == 1 and Lang:t('info.wave_verify') or Lang:t('info.wave_remove_verify')
            TriggerClientEvent('roadphone:sendOffNotification', src, message)
        else
            TriggerClientEvent('roadphone:sendOffNotification', src, Lang:t('info.command_required_information'))
        end
    end)
end, true)
RegisterCommand("connectverify", function(source, args)
    local src = source
    if #args < 2 then
        TriggerClientEvent('roadphone:sendOffNotification', src, Lang:t('info.command_required_information'))
        return
    end
    local auth = args[1]
    table.remove(args, 1)
    local label = table.concat(args, ' ')
    local verifyValue = auth == "true" and 1 or 0
    MySQL.Async.execute(
        "UPDATE `roadshop_connect_accounts` SET `verify`= @verifyValue WHERE roadshop_connect_accounts.username = @username",
        {
            ['@verifyValue'] = verifyValue,
            ['@username'] = label
        }, function(result)
            if (result == 1) then
                local message = verifyValue == 1 and Lang:t('info.connect_verify') or
                                    Lang:t('info.connect_remove_verify')
                TriggerClientEvent('roadphone:sendOffNotification', src, message)
            else
                TriggerClientEvent('roadphone:sendOffNotification', src, Lang:t('info.command_required_information'))
            end
        end)
end, true)
RegisterServerEvent("roadphone:server:call:eventnumber")
AddEventHandler("roadphone:server:call:eventnumber", function(number)
    if tostring(number) == "77777" then -- CHECK WHICH NUMBER IS CALLED
        -- YOUR CODE
    end
end)
QBCore.Functions.CreateCallback('roadphone:server:getEmployees', function(source, cb, society)
    local users = QBCore.Functions.GetQBPlayers()
    local newusers = {}
    if society == "unemployed" or society == "arbeitslos" then
        cb(newusers)
        print("[RoadPhone] Unemployed society is not allowed, please change the society name.")
        return
    end
    for k, v in pairs(users) do
        if v.PlayerData.job.name == society then
            table.insert(newusers, {
                firstname = v.PlayerData.charinfo.firstname,
                lastname = v.PlayerData.charinfo.lastname,
                job_grade = v.PlayerData.job.grade.level,
                phone_number = v.PlayerData.phone_number,
                online = true
            })
        end
    end
    cb(newusers)
end)
function getPlayerFromIban(iban) -- okokBanking support
    local players = QBCore.Functions.GetQBPlayers()
    local player = nil
    for k, v in pairs(players) do
        local playerIban = v.PlayerData.charinfo.account
        if playerIban == iban then
            player = v
            break
        end
    end
    return player
end
function getIbanFromPlayer(identifier) --okokBanking support
    local Player = QBCore.Functions.GetPlayerByCitizenId(identifier)
    if not Player then
        return
    end
    return Player.PlayerData.charinfo.account
    
end
QBCore.Functions.CreateCallback('roadphone:okokBanking:getIban', function(source, cb)
    local xPlayer = QBCore.Functions.GetPlayer(source)
    if not xPlayer then
        return
    end
    local iban = getIbanFromPlayer(xPlayer.PlayerData.citizenid)
    cb(iban)
 
end)
-- WEBHOOKS
function discordLog(color, name, message, footer, image, webhook, username)
    if not message then
        message = ''
    end
    if not username then
        username = 'RoadPhone'
    end
    local embed;
    if image then
        embed = {{
            ["color"] = color,
            ["title"] = "**" .. name .. "**",
            ["description"] = message,
            ["image"] = {
                url = image
            },
            ["footer"] = {
                ["text"] = footer
            }
        }}
    else
        embed = {{
            ["color"] = color,
            ["title"] = "**" .. name .. "**",
            ["description"] = message,
            ["footer"] = {
                ["text"] = footer
            }
        }}
    end
    if webhook == 'DISCORD WEBHOOK' then
        return
    end
    PerformHttpRequest(webhook, function(err, text, headers)
    end, 'POST', json.encode({
        username = username,
        embeds = embed
    }), {
        ['Content-Type'] = 'application/json'
    })
end
function addServiceMessage(sender, receiver, message, isRead, isOwner)
    local id = MySQL.Sync.insert(
        'INSERT INTO roadshop_service_messages (sender, receiver, message, isRead, isOwner) VALUES (@sender, @receiver, @message, @isRead, @isOwner)',
        {
            ['@sender'] = sender,
            ['@receiver'] = receiver,
            ['@message'] = message,
            ['@isRead'] = isRead,
            ['@isOwner'] = isOwner
        })
    local data = {
        id = id,
        sender = sender,
        receiver = receiver,
        message = message,
        isRead = isRead,
        isOwner = isOwner,
        date = tonumber(os.time() .. "000.0")
    }
    return data
end
function addServiceDispatch(sender, receiver, message, isRead, isOwner, image, coords) --You can add your own dispatch system for the service app.
    local id = MySQL.Sync.insert(
        'INSERT INTO roadshop_service_messages (sender, receiver, message, isRead, isOwner, isDispatch, image, coords) VALUES (@sender, @receiver, @message, @isRead, @isOwner, @isDispatch, @image, @coords)',
        {
            ['@sender'] = sender,
            ['@receiver'] = receiver,
            ['@message'] = message,
            ['@isRead'] = isRead,
            ['@isOwner'] = isOwner,
            ['@isDispatch'] = 1,
            ['@image'] = image,
            ['@coords'] = json.encode(coords)
        })
    local data = {
        id = id,
        sender = sender,
        receiver = receiver,
        message = message,
        isRead = isRead,
        isOwner = isOwner,
        date = tonumber(os.time() .. "000.0"),
        image = image,
        isDispatch = 1,
        isAccepted = 0,
        isFinished = 0,
        isDeclined = 0,
        isAnonym = 0,
        coords = coords
    }
    return data
end
function testMailServer(identifier)
    local data = {
        sender = 'RoadShop',
        subject = "RoadShop TEST",
        message = "Mails from scripts come back even better than before now even with Color support. 
 
 + Support for line breaks and button support ^^",
        button = {
            buttonEvent = "qb-drugs:client:setLocation",
            buttonData = "test",
            buttonname = "test"
          }
    }
    exports['roadphone']:sendMailOffline(identifier, data)
end
function isAbleToTweet(identifier)
    return true
    
end
function isAbleToPostConnect(identifier)
    return true
    
end
function getBlockedNumbers(identifier)
    local numbers = MySQL.Sync.fetchScalar("SELECT numbers FROM roadshop_blocked_numbers WHERE identifier = @identifier", {
        ["@identifier"] = identifier
    })
    if numbers then
        return json.decode(numbers)
    end
    return nil
    
end
RegisterServerEvent('roadphone:server:blocknumber')
AddEventHandler("roadphone:server:blocknumber", function(number)
    local _source = source
    local xPlayer = QBCore.Functions.GetPlayer(_source)
    
    if xPlayer then
        local identifier = xPlayer.PlayerData.citizenid
        local numbers = MySQL.Sync.fetchScalar("SELECT numbers FROM roadshop_blocked_numbers WHERE identifier = @identifier", {
            ["@identifier"] = identifier
        })
        if numbers then
            numbers = json.decode(numbers)
            if numbers == nil then
                numbers = {}
            end
            for i = 1, #numbers do
                if tostring(numbers[i]) == tostring(number) then
                    TriggerClientEvent("roadphone:sendNotification", _source, {
                        apptitle = 'APP_CALL_NAME',
                        title = _U('call_already_blocked'),
                        img = "/public/img/Apps/light_mode/call.webp"
                    })
                    return
                end
            end
    
            table.insert(numbers, number)
            TriggerClientEvent("roadphone:blocked:numbers", _source, 'add', number)
            MySQL.Async.execute("UPDATE roadshop_blocked_numbers SET numbers = @numbers WHERE identifier = @identifier", {
                ["@identifier"] = identifier,
                ["@numbers"] = json.encode(numbers)
            })
            return
        end
        numbers = {}
        table.insert(numbers, number)
        MySQL.Async.execute("INSERT INTO roadshop_blocked_numbers (identifier, numbers) VALUES (@identifier, @number)", {
            ["@identifier"] = identifier,
            ["@number"] = json.encode(numbers)
        })
        TriggerClientEvent("roadphone:blocked:numbers", _source, 'add', number)
    end
end)
RegisterServerEvent('roadphone:server:unblocknumber')
AddEventHandler("roadphone:server:unblocknumber", function(number)
    local _source = source
    local xPlayer = QBCore.Functions.GetPlayer(_source)
    
    if xPlayer then
        local identifier = xPlayer.PlayerData.citizenid
        local numbers = MySQL.Sync.fetchScalar("SELECT numbers FROM roadshop_blocked_numbers WHERE identifier = @identifier", {
            ["@identifier"] = identifier
        })
        if numbers then
            numbers = json.decode(numbers)
            if numbers == nil then
                numbers = {}
            end
            for i = 1, #numbers do
                if tostring(numbers[i]) == tostring(number) then
                    table.remove(numbers, i)
                    break
                end
            end
            MySQL.Async.execute("UPDATE roadshop_blocked_numbers SET numbers = @numbers WHERE identifier = @identifier", {
                ["@identifier"] = identifier,
                ["@numbers"] = json.encode(numbers)
            })
            TriggerClientEvent("roadphone:blocked:numbers", _source, 'remove', number)
        end
    end
end)
function addServiceDispatchAnonym(sender, receiver, message, isRead, isOwner, image, coords) -- You can add your own dispatch system for the service app.
    local id = MySQL.Sync.insert(
        'INSERT INTO roadshop_service_messages (sender, receiver, message, isRead, isOwner, isDispatch, isAnonym, image, coords) VALUES (@sender, @receiver, @message, @isRead, @isOwner, @isDispatch, @isAnonym, @image, @coords)',
        {
            ['@sender'] = sender,
            ['@receiver'] = receiver,
            ['@message'] = message,
            ['@isRead'] = isRead,
            ['@isOwner'] = isOwner,
            ['@isDispatch'] = 1,
            ['@isAnonym'] = 1,
            ['@image'] = image,
            ['@coords'] = json.encode(coords)
        })
    local data = {
        id = id,
        sender = sender,
        receiver = receiver,
        message = message,
        isRead = isRead,
        isOwner = isOwner,
        date = tonumber(os.time() .. "000.0"),
        image = image,
        isDispatch = 1,
        isAccepted = 0,
        isFinished = 0,
        isDeclined = 0,
        isAnonym = 1,
        coords = coords
    }
    return data
end
exports('sendDispatchAnonym', function (job, title, message, coords, image)
    if not job or not message or not title or not coords then
        return
    end
    local targets = getPlayersByJob(job)
    local targetmessage = addServiceDispatchAnonym(title, job, message, 0, 0, image, coords)
    for _, target in ipairs(targets) do
        TriggerClientEvent("roadphone:service:receiveMessage:job", target.id, targetmessage, 0)
    end
    discordLog("15158332", "Service",'ServerSide triggered Dispatch \n' .. 'Title: ' .. title .. '\n' .. 'Message: ' .. message .. '\n' .. 'Received Job: ' .. job, "RoadPhone", nil, Cfg.ServiceWebhook, "Service")
    
end)
RegisterCommand('anonymDispatch', function ()
    exports['roadphone']:sendDispatchAnonym('police', 'Robbery', 'Robbery infos: xyz', {x = -1851.1, y = -1248.8, z = 8.6}, nil)
    
end)
function addTaxiMoneySociety(payment)
    exports['qb-banking']:AddMoney(Config.TaxiSociety, payment, 'Customer payment')
    
end