-- Auto-generated by scripts/generate_interrupt_data.py
-- Source: scripts/interrupt_seed.json + wow-tools DB2 build 12.0.1.66384
-- Do not edit this file by hand.

local ADDON_NAME, ns = ...

local InterruptData = {}
ns.InterruptData = InterruptData

if MedaAuras and MedaAuras.Log then
    MedaAuras.Log("[InterruptData] Loaded OK")
end

-- ============================================================================
-- All interrupt spells keyed by spellID (fast lookup for laundering checks)
-- ============================================================================

InterruptData.ALL_INTERRUPTS = {
    [351338] = {
        name = "Quell",
        cd = 20,
        icon = 4622469,
    },
    [1766] = {
        name = "Kick",
        cd = 15,
        icon = 132219,
    },
    [6552] = {
        name = "Pummel",
        cd = 15,
        icon = 132938,
    },
    [2139] = {
        name = "Counterspell",
        cd = 25,
        icon = 135856,
    },
    [57994] = {
        name = "Wind Shear",
        cd = 12,
        icon = 136018,
    },
    [106839] = {
        name = "Skull Bash",
        cd = 15,
        icon = 236946,
    },
    [78675] = {
        name = "Solar Beam",
        cd = 60,
        icon = 252188,
    },
    [96231] = {
        name = "Rebuke",
        cd = 15,
        icon = 523893,
    },
    [47528] = {
        name = "Mind Freeze",
        cd = 15,
        icon = 237527,
    },
    [147362] = {
        name = "Counter Shot",
        cd = 24,
        icon = 249170,
    },
    [187707] = {
        name = "Muzzle",
        cd = 15,
        icon = 1376045,
    },
    [282220] = {
        name = "Muzzle",
        cd = 15,
        icon = 1376045,
    },
    [183752] = {
        name = "Disrupt",
        cd = 15,
        icon = 1305153,
    },
    [116705] = {
        name = "Spear Hand Strike",
        cd = 15,
        icon = 608940,
    },
    [15487] = {
        name = "Silence",
        cd = 30,
        icon = 458230,
    },
    [119910] = {
        name = "Spell Lock",
        cd = 24,
        icon = 136174,
    },
    [19647] = {
        name = "Spell Lock",
        cd = 24,
        icon = 136174,
    },
    [89766] = {
        name = "Axe Toss",
        cd = 30,
        icon = 236316,
    },
    [1276467] = {
        name = "Grimoire: Fel Ravager",
        cd = 25,
        icon = 136217,
    },
    [119914] = {
        name = "Axe Toss",
        cd = 30,
        icon = 236316,
    },
    [132409] = {
        name = "Fel Ravager / Spell Lock",
        cd = 25,
        icon = 136174,
    },
}

-- ============================================================================
-- Full array with class/pet metadata (for FocusInterruptHelper-style iteration)
-- ============================================================================

InterruptData.INTERRUPTS = {
    {
        id = 351338,
        name = "Quell",
        class = "EVOKER",
        baseCD = 20,
    },
    {
        id = 1766,
        name = "Kick",
        class = "ROGUE",
        baseCD = 15,
    },
    {
        id = 6552,
        name = "Pummel",
        class = "WARRIOR",
        baseCD = 15,
    },
    {
        id = 2139,
        name = "Counterspell",
        class = "MAGE",
        baseCD = 25,
    },
    {
        id = 57994,
        name = "Wind Shear",
        class = "SHAMAN",
        baseCD = 12,
    },
    {
        id = 106839,
        name = "Skull Bash",
        class = "DRUID",
        baseCD = 15,
    },
    {
        id = 78675,
        name = "Solar Beam",
        class = "DRUID",
        baseCD = 60,
    },
    {
        id = 96231,
        name = "Rebuke",
        class = "PALADIN",
        baseCD = 15,
    },
    {
        id = 47528,
        name = "Mind Freeze",
        class = "DEATHKNIGHT",
        baseCD = 15,
    },
    {
        id = 147362,
        name = "Counter Shot",
        class = "HUNTER",
        baseCD = 24,
    },
    {
        id = 187707,
        name = "Muzzle",
        class = "HUNTER",
        baseCD = 15,
    },
    {
        id = 183752,
        name = "Disrupt",
        class = "DEMONHUNTER",
        baseCD = 15,
    },
    {
        id = 116705,
        name = "Spear Hand Strike",
        class = "MONK",
        baseCD = 15,
    },
    {
        id = 15487,
        name = "Silence",
        class = "PRIEST",
        baseCD = 30,
    },
    {
        id = 119910,
        name = "Spell Lock",
        class = "WARLOCK",
        baseCD = 24,
        pet = true,
        altIDs = {
            19647,
            119898,
            1276467,
            89766,
        },
    },
    {
        id = 19647,
        name = "Spell Lock",
        class = "WARLOCK",
        baseCD = 24,
        pet = true,
        altIDs = {
            119910,
            119898,
            1276467,
            89766,
        },
    },
    {
        id = 89766,
        name = "Axe Toss",
        class = "WARLOCK",
        baseCD = 30,
        pet = true,
        altIDs = {
            119910,
            19647,
            119898,
            1276467,
        },
    },
    {
        id = 1276467,
        name = "Grimoire: Fel Ravager",
        class = "WARLOCK",
        baseCD = 25,
        altIDs = {
            119910,
            19647,
            89766,
        },
    },
}

InterruptData.INTERRUPT_BY_SPELL = {}
for _, info in ipairs(InterruptData.INTERRUPTS) do
    InterruptData.INTERRUPT_BY_SPELL[info.id] = info
end
InterruptData.INTERRUPT_BY_SPELL[282220] = {
    id = 282220,
    name = "Muzzle",
    class = "HUNTER",
    baseCD = 15,
}
InterruptData.INTERRUPT_BY_SPELL[119914] = {
    id = 119914,
    name = "Axe Toss",
    class = "WARLOCK",
    baseCD = 30,
    pet = true,
    altIDs = {
        119910,
        19647,
        89766,
        1276467,
    },
}
InterruptData.INTERRUPT_BY_SPELL[132409] = {
    id = 132409,
    name = "Fel Ravager / Spell Lock",
    class = "WARLOCK",
    baseCD = 25,
    altIDs = {
        119910,
        19647,
        89766,
        1276467,
    },
}

-- ============================================================================
-- Default (primary) interrupt per class for auto-registration
-- ============================================================================

InterruptData.CLASS_DEFAULTS = {
    WARRIOR = {
        id = 6552,
        cd = 15,
        name = "Pummel",
    },
    ROGUE = {
        id = 1766,
        cd = 15,
        name = "Kick",
    },
    MAGE = {
        id = 2139,
        cd = 25,
        name = "Counterspell",
    },
    SHAMAN = {
        id = 57994,
        cd = 12,
        name = "Wind Shear",
    },
    DRUID = {
        id = 106839,
        cd = 15,
        name = "Skull Bash",
    },
    DEATHKNIGHT = {
        id = 47528,
        cd = 15,
        name = "Mind Freeze",
    },
    PALADIN = {
        id = 96231,
        cd = 15,
        name = "Rebuke",
    },
    DEMONHUNTER = {
        id = 183752,
        cd = 15,
        name = "Disrupt",
    },
    MONK = {
        id = 116705,
        cd = 15,
        name = "Spear Hand Strike",
    },
    PRIEST = {
        id = 15487,
        cd = 30,
        name = "Silence",
    },
    HUNTER = {
        id = 147362,
        cd = 24,
        name = "Counter Shot",
    },
    WARLOCK = {
        id = 19647,
        cd = 24,
        name = "Spell Lock",
    },
    EVOKER = {
        id = 351338,
        cd = 20,
        name = "Quell",
    },
}

-- ============================================================================
-- Ordered spell IDs to check per class (first known spell wins as primary)
-- ============================================================================

InterruptData.CLASS_INTERRUPT_LIST = {
    WARRIOR = {
        6552,
    },
    ROGUE = {
        1766,
    },
    MAGE = {
        2139,
    },
    SHAMAN = {
        57994,
    },
    DRUID = {
        106839,
        78675,
    },
    DEATHKNIGHT = {
        47528,
    },
    PALADIN = {
        96231,
    },
    DEMONHUNTER = {
        183752,
    },
    MONK = {
        116705,
    },
    PRIEST = {
        15487,
    },
    HUNTER = {
        147362,
        187707,
        282220,
    },
    WARLOCK = {
        19647,
        132409,
        119914,
        119910,
    },
    EVOKER = {
        351338,
    },
}

-- ============================================================================
-- Legacy spec override and no-interrupt tables
-- ============================================================================

InterruptData.SPEC_OVERRIDES = {
    [102] = {
        id = 78675,
        cd = 60,
        name = "Solar Beam",
    },
    [255] = {
        id = 187707,
        cd = 15,
        name = "Muzzle",
    },
    [264] = {
        id = 57994,
        cd = 30,
        name = "Wind Shear",
    },
    [265] = {
        id = 19647,
        cd = 24,
        name = "Spell Lock",
        isPet = true,
    },
    [266] = {
        id = 119914,
        cd = 30,
        name = "Axe Toss",
        isPet = true,
        petSpellID = 89766,
    },
    [267] = {
        id = 19647,
        cd = 24,
        name = "Spell Lock",
        isPet = true,
    },
}

InterruptData.SPEC_NO_INTERRUPT = {
    [65] = true,
    [105] = true,
    [256] = true,
    [257] = true,
}

InterruptData.HEALER_KEEPS_KICK = {
    SHAMAN = true,
    MONK = true,
    EVOKER = true,
}

-- ============================================================================
-- Spec and role capability metadata
-- ============================================================================

InterruptData.SPEC_CAPABILITIES = {
    [71] = {
        class = "WARRIOR",
        role = "DAMAGER",
        primary = {
            spellID = 6552,
            baseCD = 15,
            name = "Pummel",
        },
    },
    [72] = {
        class = "WARRIOR",
        role = "DAMAGER",
        primary = {
            spellID = 6552,
            baseCD = 15,
            name = "Pummel",
        },
    },
    [73] = {
        class = "WARRIOR",
        role = "TANK",
        primary = {
            spellID = 6552,
            baseCD = 15,
            name = "Pummel",
        },
    },
    [62] = {
        class = "MAGE",
        role = "DAMAGER",
        primary = {
            spellID = 2139,
            baseCD = 25,
            name = "Counterspell",
        },
    },
    [63] = {
        class = "MAGE",
        role = "DAMAGER",
        primary = {
            spellID = 2139,
            baseCD = 25,
            name = "Counterspell",
        },
    },
    [64] = {
        class = "MAGE",
        role = "DAMAGER",
        primary = {
            spellID = 2139,
            baseCD = 25,
            name = "Counterspell",
        },
    },
    [65] = {
        class = "PALADIN",
        role = "HEALER",
        hasInterrupt = false,
    },
    [66] = {
        class = "PALADIN",
        role = "TANK",
        primary = {
            spellID = 96231,
            baseCD = 15,
            name = "Rebuke",
        },
    },
    [70] = {
        class = "PALADIN",
        role = "DAMAGER",
        primary = {
            spellID = 96231,
            baseCD = 15,
            name = "Rebuke",
        },
    },
    [102] = {
        class = "DRUID",
        role = "DAMAGER",
        primary = {
            spellID = 78675,
            baseCD = 60,
            name = "Solar Beam",
        },
    },
    [103] = {
        class = "DRUID",
        role = "DAMAGER",
        primary = {
            spellID = 106839,
            baseCD = 15,
            name = "Skull Bash",
        },
    },
    [104] = {
        class = "DRUID",
        role = "TANK",
        primary = {
            spellID = 106839,
            baseCD = 15,
            name = "Skull Bash",
        },
    },
    [105] = {
        class = "DRUID",
        role = "HEALER",
        hasInterrupt = false,
    },
    [250] = {
        class = "DEATHKNIGHT",
        role = "TANK",
        primary = {
            spellID = 47528,
            baseCD = 15,
            name = "Mind Freeze",
        },
    },
    [251] = {
        class = "DEATHKNIGHT",
        role = "DAMAGER",
        primary = {
            spellID = 47528,
            baseCD = 15,
            name = "Mind Freeze",
        },
    },
    [252] = {
        class = "DEATHKNIGHT",
        role = "DAMAGER",
        primary = {
            spellID = 47528,
            baseCD = 15,
            name = "Mind Freeze",
        },
    },
    [253] = {
        class = "HUNTER",
        role = "DAMAGER",
        primary = {
            spellID = 147362,
            baseCD = 24,
            name = "Counter Shot",
        },
    },
    [254] = {
        class = "HUNTER",
        role = "DAMAGER",
        primary = {
            spellID = 147362,
            baseCD = 24,
            name = "Counter Shot",
        },
    },
    [255] = {
        class = "HUNTER",
        role = "DAMAGER",
        primary = {
            spellID = 187707,
            baseCD = 15,
            name = "Muzzle",
        },
    },
    [256] = {
        class = "PRIEST",
        role = "HEALER",
        hasInterrupt = false,
    },
    [257] = {
        class = "PRIEST",
        role = "HEALER",
        hasInterrupt = false,
    },
    [258] = {
        class = "PRIEST",
        role = "DAMAGER",
        primary = {
            spellID = 15487,
            baseCD = 30,
            name = "Silence",
        },
    },
    [259] = {
        class = "ROGUE",
        role = "DAMAGER",
        primary = {
            spellID = 1766,
            baseCD = 15,
            name = "Kick",
        },
    },
    [260] = {
        class = "ROGUE",
        role = "DAMAGER",
        primary = {
            spellID = 1766,
            baseCD = 15,
            name = "Kick",
        },
    },
    [261] = {
        class = "ROGUE",
        role = "DAMAGER",
        primary = {
            spellID = 1766,
            baseCD = 15,
            name = "Kick",
        },
    },
    [262] = {
        class = "SHAMAN",
        role = "DAMAGER",
        primary = {
            spellID = 57994,
            baseCD = 12,
            name = "Wind Shear",
        },
    },
    [263] = {
        class = "SHAMAN",
        role = "DAMAGER",
        primary = {
            spellID = 57994,
            baseCD = 12,
            name = "Wind Shear",
        },
    },
    [264] = {
        class = "SHAMAN",
        role = "HEALER",
        primary = {
            spellID = 57994,
            baseCD = 30,
            name = "Wind Shear",
        },
    },
    [265] = {
        class = "WARLOCK",
        role = "DAMAGER",
        primary = {
            spellID = 19647,
            pet = true,
            baseCD = 24,
            name = "Spell Lock",
        },
        alternates = {
            {
                spellID = 119910,
                pet = true,
                baseCD = 24,
                name = "Spell Lock",
            },
        },
    },
    [266] = {
        class = "WARLOCK",
        role = "DAMAGER",
        primary = {
            spellID = 119914,
            baseCD = 30,
            pet = true,
            petSpellID = 89766,
            name = "Axe Toss",
        },
        extras = {
            {
                spellID = 132409,
                baseCD = 25,
                name = "Fel Ravager / Spell Lock",
                talentCheck = 1276467,
            },
        },
    },
    [267] = {
        class = "WARLOCK",
        role = "DAMAGER",
        primary = {
            spellID = 19647,
            pet = true,
            baseCD = 24,
            name = "Spell Lock",
        },
        alternates = {
            {
                spellID = 119910,
                pet = true,
                baseCD = 24,
                name = "Spell Lock",
            },
        },
    },
    [268] = {
        class = "MONK",
        role = "TANK",
        primary = {
            spellID = 116705,
            baseCD = 15,
            name = "Spear Hand Strike",
        },
    },
    [269] = {
        class = "MONK",
        role = "DAMAGER",
        primary = {
            spellID = 116705,
            baseCD = 15,
            name = "Spear Hand Strike",
        },
    },
    [270] = {
        class = "MONK",
        role = "HEALER",
        primary = {
            spellID = 116705,
            baseCD = 15,
            name = "Spear Hand Strike",
        },
    },
    [577] = {
        class = "DEMONHUNTER",
        role = "DAMAGER",
        primary = {
            spellID = 183752,
            baseCD = 15,
            name = "Disrupt",
        },
    },
    [581] = {
        class = "DEMONHUNTER",
        role = "TANK",
        primary = {
            spellID = 183752,
            baseCD = 15,
            name = "Disrupt",
        },
    },
    [1467] = {
        class = "EVOKER",
        role = "DAMAGER",
        primary = {
            spellID = 351338,
            baseCD = 20,
            name = "Quell",
        },
    },
    [1468] = {
        class = "EVOKER",
        role = "HEALER",
        primary = {
            spellID = 351338,
            baseCD = 20,
            name = "Quell",
        },
    },
    [1473] = {
        class = "EVOKER",
        role = "DAMAGER",
        primary = {
            spellID = 351338,
            baseCD = 20,
            name = "Quell",
        },
    },
}

InterruptData.ROLE_FALLBACKS = {
    WARRIOR = {
        TANK = {
            spellID = 6552,
            baseCD = 15,
            name = "Pummel",
        },
        DAMAGER = {
            spellID = 6552,
            baseCD = 15,
            name = "Pummel",
        },
    },
    MAGE = {
        DAMAGER = {
            spellID = 2139,
            baseCD = 25,
            name = "Counterspell",
        },
    },
    PALADIN = {
        HEALER = {
            hasInterrupt = false,
        },
        TANK = {
            spellID = 96231,
            baseCD = 15,
            name = "Rebuke",
        },
        DAMAGER = {
            spellID = 96231,
            baseCD = 15,
            name = "Rebuke",
        },
    },
    DRUID = {
        HEALER = {
            hasInterrupt = false,
        },
        TANK = {
            spellID = 106839,
            baseCD = 15,
            name = "Skull Bash",
        },
    },
    DEATHKNIGHT = {
        TANK = {
            spellID = 47528,
            baseCD = 15,
            name = "Mind Freeze",
        },
        DAMAGER = {
            spellID = 47528,
            baseCD = 15,
            name = "Mind Freeze",
        },
    },
    PRIEST = {
        HEALER = {
            hasInterrupt = false,
        },
        DAMAGER = {
            spellID = 15487,
            baseCD = 30,
            name = "Silence",
        },
    },
    ROGUE = {
        DAMAGER = {
            spellID = 1766,
            baseCD = 15,
            name = "Kick",
        },
    },
    SHAMAN = {
        HEALER = {
            spellID = 57994,
            baseCD = 30,
            name = "Wind Shear",
        },
        DAMAGER = {
            spellID = 57994,
            baseCD = 12,
            name = "Wind Shear",
        },
    },
    MONK = {
        TANK = {
            spellID = 116705,
            baseCD = 15,
            name = "Spear Hand Strike",
        },
        HEALER = {
            spellID = 116705,
            baseCD = 15,
            name = "Spear Hand Strike",
        },
        DAMAGER = {
            spellID = 116705,
            baseCD = 15,
            name = "Spear Hand Strike",
        },
    },
    DEMONHUNTER = {
        TANK = {
            spellID = 183752,
            baseCD = 15,
            name = "Disrupt",
        },
        DAMAGER = {
            spellID = 183752,
            baseCD = 15,
            name = "Disrupt",
        },
    },
    EVOKER = {
        HEALER = {
            spellID = 351338,
            baseCD = 20,
            name = "Quell",
        },
        DAMAGER = {
            spellID = 351338,
            baseCD = 20,
            name = "Quell",
        },
    },
}

InterruptData.CLASS_FALLBACKS = {
    WARRIOR = {
        spellID = 6552,
        baseCD = 15,
        name = "Pummel",
    },
    MAGE = {
        spellID = 2139,
        baseCD = 25,
        name = "Counterspell",
    },
    DEATHKNIGHT = {
        spellID = 47528,
        baseCD = 15,
        name = "Mind Freeze",
    },
    ROGUE = {
        spellID = 1766,
        baseCD = 15,
        name = "Kick",
    },
    MONK = {
        spellID = 116705,
        baseCD = 15,
        name = "Spear Hand Strike",
    },
    DEMONHUNTER = {
        spellID = 183752,
        baseCD = 15,
        name = "Disrupt",
    },
    EVOKER = {
        spellID = 351338,
        baseCD = 20,
        name = "Quell",
    },
}

-- ============================================================================
-- Passive CD reduction talents (applied to baseCd on inspect)
-- ============================================================================

InterruptData.CD_REDUCTION_TALENTS = {
    [388039] = {
        affects = 147362,
        reduction = 2,
        name = "Lone Survivor",
    },
    [412713] = {
        affects = 351338,
        pctReduction = 10,
        name = "Interwoven Threads",
    },
}

-- ============================================================================
-- CD reduction on successful interrupt (applied when mob cast is interrupted)
-- ============================================================================

InterruptData.CD_ON_KICK_TALENTS = {
    [378848] = {
        reduction = 3,
        name = "Coldthirst",
    },
}

-- ============================================================================
-- Extra kicks granted by spec (second interrupt ability)
-- ============================================================================

InterruptData.SPEC_EXTRA_KICKS = {
    [266] = {
        {
            id = 132409,
            cd = 25,
            name = "Fel Ravager / Spell Lock",
            icon = 136174,
            talentCheck = 1276467,
        },
    },
}

-- ============================================================================
-- Spell aliases: some spells fire different IDs on party vs own client
-- ============================================================================

InterruptData.SPELL_ALIASES = {
    [1276467] = 132409,
    [282220] = 187707,
    [119910] = 19647,
}

-- ============================================================================
-- Class colors for the tracker UI
-- ============================================================================

InterruptData.CLASS_COLORS = {
    WARRIOR = {
        0.78,
        0.61,
        0.43,
    },
    ROGUE = {
        1.0,
        0.96,
        0.41,
    },
    MAGE = {
        0.41,
        0.8,
        0.94,
    },
    SHAMAN = {
        0.0,
        0.44,
        0.87,
    },
    DRUID = {
        1.0,
        0.49,
        0.04,
    },
    DEATHKNIGHT = {
        0.77,
        0.12,
        0.23,
    },
    PALADIN = {
        0.96,
        0.55,
        0.73,
    },
    DEMONHUNTER = {
        0.64,
        0.19,
        0.79,
    },
    MONK = {
        0.0,
        1.0,
        0.59,
    },
    PRIEST = {
        1.0,
        1.0,
        1.0,
    },
    HUNTER = {
        0.67,
        0.83,
        0.45,
    },
    WARLOCK = {
        0.58,
        0.51,
        0.79,
    },
    EVOKER = {
        0.2,
        0.58,
        0.5,
    },
}

for specID, specData in pairs(InterruptData.SPEC_CAPABILITIES) do
    if specData.hasInterrupt == false then
        InterruptData.SPEC_NO_INTERRUPT[specID] = true
    end
end

local function NormalizeCapability(classToken, def)
    if not def or def.hasInterrupt == false then return nil end

    local spellID = def.spellID or def.id
    local entry = InterruptData.INTERRUPT_BY_SPELL[spellID]
    local spellMeta = InterruptData.ALL_INTERRUPTS[spellID]
    if not spellID or not spellMeta then return nil end

    local normalized = {
        spellID = spellID,
        id = spellID,
        class = classToken or def.class or (entry and entry.class),
        name = def.name or (entry and entry.name) or spellMeta.name,
        baseCD = def.baseCD or def.cd or (entry and entry.baseCD) or spellMeta.cd,
        cd = def.baseCD or def.cd or (entry and entry.baseCD) or spellMeta.cd,
        icon = def.icon or spellMeta.icon,
        pet = def.pet ~= nil and def.pet or (entry and entry.pet) or false,
        altIDs = def.altIDs or (entry and entry.altIDs),
        petSpellID = def.petSpellID,
        talentCheck = def.talentCheck,
    }

    return normalized
end

local function BuildCapabilityList(classToken, specData)
    local results = {}
    if not specData or specData.hasInterrupt == false then return results end

    if specData.primary then
        local primary = NormalizeCapability(classToken, specData.primary)
        if primary then results[#results + 1] = primary end
    end

    for _, def in ipairs(specData.alternates or {}) do
        local alt = NormalizeCapability(classToken, def)
        if alt then results[#results + 1] = alt end
    end

    for _, def in ipairs(specData.extras or {}) do
        local extra = NormalizeCapability(classToken, def)
        if extra then results[#results + 1] = extra end
    end

    return results
end

function InterruptData:GetSpecData(specID)
    return specID and self.SPEC_CAPABILITIES[specID] or nil
end

function InterruptData:SpecHasInterrupt(specID)
    local data = self:GetSpecData(specID)
    return data and data.hasInterrupt ~= false or false
end

function InterruptData:GetSpecInterruptCandidates(specID)
    local data = self:GetSpecData(specID)
    if not data then return {} end
    return BuildCapabilityList(data.class, data)
end

function InterruptData:GetPrimaryInterruptForSpec(specID)
    local candidates = self:GetSpecInterruptCandidates(specID)
    return candidates[1]
end

function InterruptData:GetRoleFallbackRecord(classToken, role)
    local classRoles = classToken and self.ROLE_FALLBACKS[classToken]
    return classRoles and role and classRoles[role] or nil
end

function InterruptData:GetRoleFallbackInterrupt(classToken, role)
    return NormalizeCapability(classToken, self:GetRoleFallbackRecord(classToken, role))
end

function InterruptData:GetClassFallbackInterrupt(classToken)
    return NormalizeCapability(classToken, classToken and self.CLASS_FALLBACKS[classToken] or nil)
end

function InterruptData:GetPlayerClassInterruptCandidates(classToken)
    local list = {}
    for _, spellID in ipairs(self.CLASS_INTERRUPT_LIST[classToken] or {}) do
        local normalized = NormalizeCapability(classToken, { spellID = spellID })
        if normalized then
            list[#list + 1] = normalized
        end
    end
    return list
end
