-- EllesmereUI_koKR_Plus / CharSheet.lua
-- 캐릭터 정보창(C) 배율 + 슬롯 등급 표시.
---@diagnostic disable: undefined-global
local NS = _G.EUIKorPlus
if not NS then return end
local GetDB = NS.GetDB
local GetFont, SolidTex, MakeFont, MakeDescFS = NS.GetFont, NS.SolidTex, NS.MakeFont, NS.MakeDescFS
local MakeBorder, SetBorderColor, MakeStepBtn, MakeSwitch = NS.MakeBorder, NS.SetBorderColor, NS.MakeStepBtn, NS.MakeSwitchlocal CS_SCALE_MIN, CS_SCALE_MAX, CS_SCALE_STEP = NS.RANGE.CS[1], NS.RANGE.CS[2], NS.RANGE.CS[3]

-- 캐릭터 정보창 배율 적용. CharacterFrame(블리자드 표준 프레임) 에
-- SetScale — 전투제한 없음. 엘스미어 캐릭터 시트 스킨도 이 프레임의
-- 자식이라 함께 배율됨. OnShow 마다 재적용(스킨/블리자드 리셋 대비).
local function ApplyCharSheetScale()
    local cf = _G.CharacterFrame
    if not cf or not cf.SetScale then return end
    local s = GetDB().charSheetScale or 1.0
    if s < CS_SCALE_MIN then s = CS_SCALE_MIN end
    if s > CS_SCALE_MAX then s = CS_SCALE_MAX end
    pcall(cf.SetScale, cf, s)
end

-- CharacterFrame OnShow 마다 재적용(스킨/블리자드가 배율 리셋 대비). 1회 후크.
local _csHooked
local function _InstallCharSheetScale()
    ApplyCharSheetScale()
    if _csHooked then return end
    local cf = _G.CharacterFrame
    if cf and cf.HookScript then
        cf:HookScript("OnShow", ApplyCharSheetScale)
        _csHooked = true
    end
end

-- ── 캐릭터창: 슬롯별 장비 등급 표시 *기능* ──────────────────────────
--  (스탯/탭/라벨 *번역* 은 Core.lua 로 이전 — _CSXlat/_CSHookStatTips 등.
--   여기는 추가기능: 각 슬롯 툴팁의 로컬라이즈 글로벌 트랙명을 모아
--   대표(최빈) 등급 1개를 슬롯 상단에 표시(항상, 옵션 없음).)
local function _mkPat(globalStr)
    if type(globalStr) ~= "string" then return nil end
    local p = globalStr:gsub("([%^%$%(%)%.%[%]%*%+%-%?])", "%%%1")
    p = p:gsub("%%%%s", "(.+)"):gsub("%%%%d", "(%%d+)")
    return p
end
local _TRACK_PAT = _mkPat(_G.ITEM_UPGRADE_FRAME_CURRENT_UPGRADE_FORMAT_STRING)

-- 장착 장비의 대표 등급(최빈 트랙명). koKR 클라가 트랙명을 이미 한글
-- ("챔피언/영웅/신화")로 줌. Chonky 방식: 포맷-스트링 글로벌 패턴 →
-- 실패 시 폴백 정규식 ": (.+) N/M"(글로벌 없거나 로캘 차이 대비).
local function _slotTrack(sid, info)
    for _, ln in ipairs(info.lines) do
        local t = ln.leftText
        if type(t) == "string" and t ~= "" then
            local trk, cur, mx
            if _TRACK_PAT then trk, cur, mx = t:match(_TRACK_PAT) end
            if not (trk and cur and mx) then
                trk, cur, mx = t:match(":%s*(.+)%s+(%d+)%s*/%s*(%d+)")
            end
            if trk and cur and mx and trk ~= "" then
                trk = trk:gsub("|c%x%x%x%x%x%x%x%x", ""):gsub("|cn.-:", "")
                          :gsub("|r", ""):gsub("^%s+", ""):gsub("%s+$", "")
                if trk ~= "" then return trk end
            end
        end
    end
end
-- 슬롯 프레임명 ↔ INVSLOT (블리자드 _G["Character*Slot"], EUI 가
-- 리스킨해도 동일 프레임이라 자체 FontString 이 함께 따라옴).
local _GEAR_SLOTS = {
    { "Head", 1 }, { "Neck", 2 }, { "Shoulder", 3 }, { "Back", 15 },
    { "Chest", 5 }, { "Wrist", 9 }, { "Hands", 10 }, { "Waist", 6 },
    { "Legs", 7 }, { "Feet", 8 }, { "Finger0", 11 }, { "Finger1", 12 },
    { "Trinket0", 13 }, { "Trinket1", 14 }, { "MainHand", 16 },
    { "SecondaryHand", 17 },
}
-- koKR 트랙명별 색(Chonky 색 정렬). 트랙 텍스트는 툴팁에서 이미 한글.
local _TRACK_COLOR = {
    ["탐험가"] = { 0.62, 0.62, 0.62 },
    ["모험가"] = { 1.00, 1.00, 1.00 },
    ["노련가"] = { 0.12, 1.00, 0.00 },
    ["챔피언"] = { 0.00, 0.55, 1.00 },
    ["영웅"]   = { 0.64, 0.21, 0.93 },
    ["신화"]   = { 1.00, 0.50, 0.00 },
}


-- ★★ taint 함정: Blizzard 슬롯 ItemButton(CharacterXxxSlot/InspectXxxSlot) 에
--   btn._tierFS / btn._gemTex 같은 사용자 필드 쓰기 금지. 외부 weak 테이블 사용.
local _tierFSRefs = setmetatable({}, { __mode = "k" })  -- btn → FontString
local _gemTexRefs = setmetatable({}, { __mode = "k" })  -- btn → { textures }

local _csShown
local function _CSUpdate()
    if not _csShown then return end
    local cf = _G.CharacterFrame
    if not cf then return end
    -- 각 장비 슬롯 *내부 상단*에 등급(챔피언/노련가/모험가…) 표시.
    if not (C_TooltipInfo and C_TooltipInfo.GetInventoryItem) then return end
    for _, sd in ipairs(_GEAR_SLOTS) do
        local btn = _G["Character" .. sd[1] .. "Slot"]
        if btn then
            local fs = _tierFSRefs[btn]
            if not fs then
                fs = btn:CreateFontString(nil, "OVERLAY")
                fs:SetFont(GetFont(), 11, "OUTLINE")
                fs:SetWordWrap(false)
                fs:SetPoint("TOP", btn, "TOP", 0, -2)
                fs:SetDrawLayer("OVERLAY", 7)
                _tierFSRefs[btn] = fs
            end
            local trk
            local link = GetInventoryItemLink("player", sd[2])
            if link then
                local ok, info = pcall(C_TooltipInfo.GetInventoryItem,
                    "player", sd[2])
                if ok and info and info.lines then
                    trk = _slotTrack(sd[2], info)
                end
            end
            if trk then
                fs:SetText(trk)
                local c = _TRACK_COLOR[trk]
                if c then fs:SetTextColor(c[1], c[2], c[3], 1)
                else fs:SetTextColor(1, 0.82, 0, 1) end
                fs:Show()
            else
                fs:Hide()
            end
        end
    end
end


-- 디바운스: 잦은 이벤트(UNIT_INVENTORY_CHANGED)·PaperDollFrame_UpdateStats
-- 가 무거운 _CSUpdate(2회 depth-7 walk + 16슬롯 툴팁조회)를 연타 호출하는
-- 것을 0.2s 윈도우로 1회 합침(_EQS_Schedule 동일 패턴, 검증된 방식).
local _csUpdPending
local function _CSSchedule()
    if not _csShown then return end
    if _csUpdPending then return end
    if not (C_Timer and C_Timer.After) then _CSUpdate(); return end
    _csUpdPending = true
    C_Timer.After(0.2, function()
        _csUpdPending = false
        _CSUpdate()
    end)
end

local _csHooked2
local function _InstallCharGear()
    local cf = _G.CharacterFrame
    if not cf then return end
    if not _csHooked2 then
        _csHooked2 = true
        cf:HookScript("OnShow", function()
            _csShown = true
            _CSUpdate()
            if C_Timer and C_Timer.After then
                C_Timer.After(0.2, _CSUpdate)   -- 스탯/아이템 비동기 갱신
                C_Timer.After(0.6, _CSUpdate)
                C_Timer.After(1.5, _CSUpdate)
            end
        end)
        cf:HookScript("OnHide", function() _csShown = false end)
        -- 스탯창 재렌더 시 등급 표시 재적용
        if type(_G.PaperDollFrame_UpdateStats) == "function" then
            hooksecurefunc("PaperDollFrame_UpdateStats", function()
                if _csShown then _CSSchedule() end
            end)
        end
        local ev = CreateFrame("Frame")
        ev:RegisterEvent("PLAYER_EQUIPMENT_CHANGED")
        ev:RegisterUnitEvent("UNIT_INVENTORY_CHANGED", "player")
        ev:SetScript("OnEvent", function()
            if _csShown then _CSSchedule() end
        end)
    end
    if cf:IsShown() then _csShown = true; _CSUpdate() end
end

-- ── 살펴보기 창(InspectFrame): 배율 + 슬롯 등급 ──────────────────────
--  InspectFrame 은 Blizzard_InspectUI 지연로드 → 로그인 시 없을 수 있어
--  ADDON_LOADED 감시. 아이템 데이터는 비동기(INSPECT_READY) → 그때 +
--  OnShow + 타이머로 슬롯 등급 갱신. 배율은 캐릭터창과 *독립*
--  (inspectScale). 슬롯명 _GEAR_SLOTS 키 재사용("Inspect"..k.."Slot").

if NS.RegisterSection then
    NS.RegisterSection({ order = 60, col = 0, row = 2, title = "캐릭터 시트 배율",
        desc = "캐릭터 정보창(C) 크기. 0.5~2.0배.",
        build = function(popup, descFS)
            NS.MakeStepperRow(popup, descFS, {
                get = function() return GetDB().charSheetScale or 1.0 end,
                set = function(v) GetDB().charSheetScale = v end,
                fmt = function(v) return string.format("배율 %.2fx", v) end,
                min = CS_SCALE_MIN, max = CS_SCALE_MAX, step = CS_SCALE_STEP,
                onChange = function() pcall(ApplyCharSheetScale) end,
            })
        end })
end
if NS.RegisterInstall then
    NS.RegisterInstall(function() _InstallCharSheetScale(); _InstallCharGear() end)
end
