-- ============================================================
-- Asylum Compagnon — Toolbox.lua
-- Petites automatisations de confort (esprit Leatrix / Auto Sell Grey /
-- Auto Queue) :
--   · vente auto des objets gris chez un marchand
--   · réparation auto (fonds de guilde en priorité)
--   · acceptation auto des files (donjon / rôle / champ de bataille)
--   · journal de combat auto en donjon/raid (Warcraft Logs)
-- Chaque option s'active dans le menu Toolbox. Tout est pcall-gardé :
-- au pire ça ne fait rien, jamais d'erreur.
-- ============================================================

local ADDON_NAME, NS = ...

local TB = {}
NS.Toolbox = TB

local function on(key) return NS.db and NS.db[key] end
local function say(msg) if NS.Msg then NS.Msg(msg) end end

-- ---------- Marchand : vente des gris + réparation ----------
local function SellGrey()
    if not on("tbAutoSell") then return end
    -- API moderne : vend toute la camelote (gris) d'un coup
    if C_MerchantFrame and C_MerchantFrame.SellAllJunkItems then
        pcall(C_MerchantFrame.SellAllJunkItems)
        return
    end
    -- repli : parcours des sacs
    if not (C_Container and C_Container.GetContainerNumSlots) then return end
    for bag = 0, (NUM_BAG_SLOTS or 4) do
        local slots = C_Container.GetContainerNumSlots(bag) or 0
        for slot = 1, slots do
            local i = C_Container.GetContainerItemInfo(bag, slot)
            if i and i.quality == 0 and not i.hasNoValue then
                pcall(C_Container.UseContainerItem, bag, slot)
            end
        end
    end
end

local function Repair()
    if not on("tbAutoRepair") then return end
    if not (CanMerchantRepair and CanMerchantRepair()) then return end
    local cost, canRepair = GetRepairAllCost()
    if not canRepair or not cost or cost <= 0 then return end
    -- fonds de guilde en priorité si l'utilisateur l'a choisi (et si dispo)
    local useGuild = not (NS.db and NS.db.tbRepairGuild == false)
    if useGuild and CanGuildBankRepair and CanGuildBankRepair() then
        local wd = GetGuildBankWithdrawMoney and GetGuildBankWithdrawMoney()
        if wd == -1 or (wd and wd >= cost) then
            pcall(RepairAllItems, true)
            say(NS.L("Équipement réparé (fonds de guilde)."))
            return
        end
    end
    if GetMoney() >= cost then
        pcall(RepairAllItems, false)
        say((NS.L("Équipement réparé : %s")):format(
            (GetCoinTextureString and GetCoinTextureString(cost)) or tostring(cost)))
    end
end

-- ---------- Files d'attente : acceptation auto ----------
local function AcceptQueues(event)
    if not on("tbAutoQueue") then return end
    -- NB : AcceptProposal / CompleteLFGRoleCheck ne sont PAS protégées (Leatrix &
    -- co les utilisent). Le « ADDON_ACTION_BLOCKED » observé venait d'une
    -- CONTAMINATION (taint) : notre lecture d'aura « secrète » du Bloodlust
    -- souillait l'exécution de l'addon → l'appel se faisait bloquer. Le correctif
    -- Bloodlust (0.34.6) supprime la source du taint ; ces appels repassent donc.
    if event == "LFG_PROPOSAL_SHOW" then
        if AcceptProposal then pcall(AcceptProposal) end
    elseif event == "LFG_ROLE_CHECK_SHOW" then
        if CompleteLFGRoleCheck then pcall(CompleteLFGRoleCheck, true) end
    elseif event == "UPDATE_BATTLEFIELD_STATUS" then
        local maxID = (GetMaxBattlefieldID and GetMaxBattlefieldID()) or 2
        for i = 1, maxID do
            if GetBattlefieldStatus and GetBattlefieldStatus(i) == "confirm" then
                pcall(AcceptBattlefieldPort, i, 1)
            end
        end
    end
end

-- ---------- Journal de combat auto (Warcraft Logs) ----------
-- Démarre le log en entrant en donjon/raid, l'arrête en sortant, et active le
-- « journal de combat avancé » (meilleures données pour Warcraft Logs).
-- NB : le fichier Logs/WoWCombatLog.txt ne peut PAS être vidé par un addon
-- (aucune API de fichier) ; le nettoyage se fait hors-jeu (voir README).
local weStartedLog = false
local function WantLog(kind)
    if kind == "party" or kind == "scenario" then return on("tbAutoLogDungeon") end
    if kind == "raid" then return on("tbAutoLogRaid") end
    return false
end
function TB.UpdateAutoLog()
    local inInstance, itype = IsInInstance()
    local want = inInstance and WantLog(itype) or false
    if want then
        if not weStartedLog then
            if SetCVar then pcall(SetCVar, "advancedCombatLogging", 1) end
            if LoggingCombat then pcall(LoggingCombat, true) end
            weStartedLog = true
            say(NS.L("Journal de combat activé (Warcraft Logs)."))
        end
    elseif weStartedLog then
        if LoggingCombat then pcall(LoggingCombat, false) end
        weStartedLog = false
        say(NS.L("Journal de combat arrêté."))
    end
end

-- ---------- Événements ----------
local f = CreateFrame("Frame")
f:RegisterEvent("MERCHANT_SHOW")
f:RegisterEvent("LFG_PROPOSAL_SHOW")
f:RegisterEvent("LFG_ROLE_CHECK_SHOW")
f:RegisterEvent("UPDATE_BATTLEFIELD_STATUS")
f:SetScript("OnEvent", function(_, event)
    if event == "MERCHANT_SHOW" then
        SellGrey()
        Repair()
    else
        AcceptQueues(event)
    end
end)

-- entrée/sortie d'instance → journal de combat auto
local logFrame = CreateFrame("Frame")
logFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
logFrame:RegisterEvent("ZONE_CHANGED_NEW_AREA")
logFrame:SetScript("OnEvent", function() TB.UpdateAutoLog() end)
