-- CoAClassColors.lua
--
-- Mirrors the live client's RAID_CLASS_COLORS palette into
-- Altoholic.ClassInfo so the guild/character/profession panes render
-- the 21 Conquest-of-Azeroth custom classes (plus HERO) instead of
-- defaulting to WHITE via the `or WHITE` fallback at
-- Altoholic.lua:581.
--
-- Background
-- ----------
-- Altoholic ships a hardcoded ChatColor table keyed by the 10 vanilla
-- englishClass tokens (Altoholic.lua:23-32). On the CoA Voljin/PTR
-- realm, UnitClass / GetGuildRosterInfo return tokens like BARBARIAN,
-- WITCHDOCTOR, CHRONOMANCER, … which fall through the table.
--
-- The realm-authoritative palette is shipped by the client itself in
-- _G.RAID_CLASS_COLORS (Interface/SharedXML/SharedConstants.lua inside
-- patch-B.MPQ — 10 vanilla + HERO + 21 CoA = 32 entries on Voljin).
-- Other Exiles addon ports follow the same mirror pattern
-- (coa-omen/CoAClassColors.lua → CUSTOM_CLASS_COLORS,
--  coa-shadowedunitframes/.../CoAClassColors.lua → SUF profile,
--  coa-kui-nameplates/.../CoAClassColors.lua → !ClassColors).
--
-- Source of truth: db.exil.es /coa/dev for the full palette;
-- _G.RAID_CLASS_COLORS at FrameXML load time for the running client.

local Alto = _G.Altoholic
local AC = Alto and Alto.ClassInfo
if type(AC) ~= "table" then return end

local source = _G.RAID_CLASS_COLORS
if type(source) ~= "table" then return end

local function unpackColor(c)
    if type(c) ~= "table" then return end
    if c.GetRGB then return c:GetRGB() end
    return c.r, c.g, c.b
end

for token, color in pairs(source) do
    if AC[token] == nil then
        local r, g, b = unpackColor(color)
        if r and g and b then
            AC[token] = string.format("|cFF%02X%02X%02X",
                r * 255 + 0.5, g * 255 + 0.5, b * 255 + 0.5)
        end
    end
end

-- Class ICONS
-- -----------
-- WoW's _G.CLASS_ICON_TCOORDS only carries texcoords for the playable
-- classes the *client* shipped with — on the CoA Voljin client that is
-- the vanilla 10 + DEATHKNIGHT only. The 21 CoA custom classes
-- (BARBARIAN, WITCHDOCTOR, CHRONOMANCER, …) have no entry, so any draw
-- site that does `CLASS_ICON_TCOORDS[class]` falls back to a wrong or
-- blank icon (Altoholic.lua:ShowClassIcons hit this).
--
-- The realm-authoritative class-icon atlas is the 512x512 (8x8 grid of
-- 64px cells) BLP that the CoA Details! fork bundles and renders for
-- all 32 classes. We ship a copy of that atlas as
-- Interface\AddOns\Altoholic\images\coa-classes.blp and reproduce its
-- per-token texcoords below (source: Details/functions/profiles.lua
-- class_coords). Keyed by the UPPERCASE englishClass token — the same
-- key DataStore stores (DataStore_Characters: UnitClass()'s 2nd return)
-- and CLASS_ICON_TCOORDS uses, so it is a drop-in for both.
--
-- Includes the vanilla 10 + DK too, so a single lookup covers every
-- CoA-playable class uniformly out of one texture.

local COA_CLASS_ICON_TEXTURE = [[Interface\AddOns\Altoholic\images\coa-classes]]

-- left, right, top, bottom (verbatim from the CoA Details atlas)
local COA_CLASS_ICON_TCOORDS = {
    WITCHHUNTER   = { 0.875, 1,     0.375, 0.5   },
    WITCHDOCTOR   = { 0.75,  0.875, 0.375, 0.5   },
    WILDWALKER    = { 0.625, 0.75,  0.375, 0.5   },
    WARRIOR       = { 0.5,   0.625, 0.375, 0.5   },
    WARLOCK       = { 0.375, 0.5,   0.375, 0.5   },
    TINKER        = { 0.25,  0.375, 0.375, 0.5   },
    SUNCLERIC     = { 0.125, 0.25,  0.375, 0.5   },
    STORMBRINGER  = { 0,     0.125, 0.375, 0.5   },
    STARCALLER    = { 0.875, 1,     0.25,  0.375 },
    SPIRITMAGE    = { 0.75,  0.875, 0.25,  0.375 },
    SONOFARUGAL   = { 0.625, 0.75,  0.25,  0.375 },
    SHAMAN        = { 0.5,   0.625, 0.25,  0.375 },
    ROGUE         = { 0.375, 0.5,   0.25,  0.375 },
    REAPER        = { 0.25,  0.375, 0.25,  0.375 },
    RANGER        = { 0.125, 0.25,  0.25,  0.375 },
    PYROMANCER    = { 0,     0.125, 0.25,  0.375 },
    PROPHET       = { 0.875, 1,     0.125, 0.25  },
    PRIEST        = { 0.75,  0.875, 0.125, 0.25  },
    PALADIN       = { 0.625, 0.75,  0.125, 0.25  },
    NECROMANCER   = { 0.5,   0.625, 0.125, 0.25  },
    MONK          = { 0.375, 0.5,   0.125, 0.25  },
    MAGE          = { 0.25,  0.375, 0.125, 0.25  },
    HUNTER        = { 0.125, 0.25,  0.125, 0.25  },
    HERO          = { 0,     0.125, 0.125, 0.25  },
    GUARDIAN      = { 0.875, 1,     0,     0.125 },
    FLESHWARDEN   = { 0.75,  0.875, 0,     0.125 },
    DRUID         = { 0.625, 0.75,  0,     0.125 },
    DEMONHUNTER   = { 0.5,   0.625, 0,     0.125 },
    DEATHKNIGHT   = { 0.375, 0.5,   0,     0.125 },
    CULTIST       = { 0.25,  0.375, 0,     0.125 },
    CHRONOMANCER  = { 0.125, 0.25,  0,     0.125 },
    BARBARIAN     = { 0,     0.125, 0,     0.125 },
}

-- Returns texture, left, right, top, bottom for a CoA-playable class
-- token, or nil if the token is unknown (caller should fall back to the
-- stock CLASS_ICON_TCOORDS path). Tolerant of a nil/missing token.
function Alto:GetCoAClassIcon(token)
    if type(token) ~= "string" then return end
    local tc = COA_CLASS_ICON_TCOORDS[token]
    if not tc then return end
    return COA_CLASS_ICON_TEXTURE, tc[1], tc[2], tc[3], tc[4]
end
