---@diagnostic disable: undefined-field, undefined-global
---@type string
local AddonName = ...
---@class Private
local Private = select(2, ...)

-- AUTORES-01..05: akzeptiert eingehende Spieler-Wiederbelebungen automatisch,
-- sofern der Master aktiv ist und keine der beiden Sicherheitsausnahmen greift.
-- Das Feature ist vollständig lokal-only: keine Kommunikation, kein Broadcast und
-- keine UI-Erzeugung in dieser Datei.
--
-- Private.*-Abhängigkeiten:
--   Private.safecall ist die einzige Abhängigkeit. Sie muss beim Laden aus
--   Utility.lua vorhanden sein; die Event-Dispatch-Funktion verwendet sie später
--   zur Laufzeit.
--
-- Der TOC-Slot ist load-bearing: Diese Datei muss nach Init.lua (Private.safecall)
-- und nach Migrations.lua (der autoresaccept-SavedVars-Blattknoten) geladen werden.
-- Sie liegt unterhalb der do-not-package-Grenze und bleibt deshalb in jedem Build
-- enthalten; der Solo-Test bleibt damit ebenfalls ungated.

local function ShouldAutoAccept(caster)
    local settings = WildThingsSavedVars and WildThingsSavedVars.autoresaccept
    if not settings or not settings.enabled then
        return false, "feature off"
    end
    if settings.excludeAfterlife and UnitIsDead(caster) then
        return false, "caster is dead (afterlife)"
    end
    if settings.excludeCombat and UnitAffectingCombat(caster) then
        return false, "caster in combat (battle-rez)"
    end
    return true, "accepted"
end

local resFrame = CreateFrame("Frame")

function resFrame:OnEvent(event, ...)
    Private.safecall(self[event], self, event, ...)
end

resFrame:SetScript("OnEvent", resFrame.OnEvent)
resFrame:RegisterEvent("RESURRECT_REQUEST")

function resFrame:RESURRECT_REQUEST(event, caster)
    local accept = ShouldAutoAccept(caster)
    if not accept then return end

    AcceptResurrect()
    -- AcceptResurrect() succeeds silently but leaves Blizzard's resurrect dialog
    -- visible; hide it after accepting so the UI does not look as if it failed.
    StaticPopup_Hide("RESURRECT_NO_TIMER")
end

-- Private:AutoResAcceptTest(): unadvertised /wt restest solo harness. This file
-- ships in every build, so the harness stays ungated; it crosses no trust boundary
-- and sends nothing. Testing against the player's own name makes all four decision
-- branches reachable by one person: stand in combat at a dummy for combat, or be
-- a ghost for afterlife.
function Private:AutoResAcceptTest()
    local playerName = UnitName("player")
    local accept, reason = ShouldAutoAccept(playerName)
    local settings = WildThingsSavedVars and WildThingsSavedVars.autoresaccept or {}
    print("|cff99ff00Wild Things:|r restest -- accept=" .. tostring(accept)
        .. " reason=" .. tostring(reason)
        .. " enabled=" .. tostring(settings.enabled)
        .. " excludeCombat=" .. tostring(settings.excludeCombat)
        .. " excludeAfterlife=" .. tostring(settings.excludeAfterlife))
end
