-- EllesmereUI_koKR_Plus / DropdownFont.lua
-- 검색형 드롭다운(특성알림 등) 목록 글자 크기 맞춤. 기본 끔.
---@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.MakeSwitch
-- ============================================================
--  검색형 드롭다운 목록 글자 크기 맞춤 (옵션, 기본 끔)
--  특성알림 등의 검색형 드롭다운(FULLSCREEN_DIALOG + EditBox + ScrollFrame)
--  목록 항목 글자(11px)가 드롭다운 버튼(13px)보다 작아 보이는 문제.
--  토글 ON 시 팝업 내 13px 미만 FontString 을 13px 로 키움. 팝업 OnShow
--  후크로 재적용(항목 재생성 대비), 토글 OFF 시 원래 크기로 복원.
--  폴링 없음 — Core.lua 페이지 burst 스캔(_DoScan)이 _DDF_Apply 를 호출.
-- ============================================================
local DDF_MIN, DDF_MAX, DDF_STEP = 9, 20, 1   -- 사용자 선택 글자 크기 범위
local _ddfPopups = setmetatable({}, { __mode = "k" })  -- popup -> true (후크 설치됨)
local _ddfFS     = setmetatable({}, { __mode = "k" })  -- fs -> 원래 크기 (복원용)

local function _DDF_BumpFS(fs)
    if not (fs and fs.GetFont and fs.SetFont) then return end
    local ok, f, sz, fl = pcall(fs.GetFont, fs)
    if not ok or not f or not sz then return end
    -- 목록 항목(작은 글자)만 대상. 최초 관측 크기가 13 미만이면 목록 항목으로
    -- 간주하고 원본 보존; 13 이상(드롭다운 버튼·헤더)은 건드리지 않음.
    local orig = _ddfFS[fs]
    if orig == nil then
        if sz >= 13 then return end
        _ddfFS[fs] = sz
    end
    local target = GetDB().ddItemFontSize or 13
    if sz ~= target then pcall(fs.SetFont, fs, f, target, fl or "") end
end

local function _DDF_WalkBump(frame, depth)
    if not frame or depth > 8 then return end
    if frame.GetRegions then
        local ok, rs = pcall(function() return { frame:GetRegions() } end)
        if ok and type(rs) == "table" then
            for _, r in ipairs(rs) do
                local tok, ot = pcall(function() return r and r.GetObjectType and r:GetObjectType() end)
                if tok and ot == "FontString" then _DDF_BumpFS(r) end
            end
        end
    end
    if frame.GetChildren then
        local ok, cs = pcall(function() return { frame:GetChildren() } end)
        if ok and type(cs) == "table" then
            for _, c in ipairs(cs) do _DDF_WalkBump(c, depth + 1) end
        end
    end
end

-- 검색형 드롭다운 팝업 시그니처: 직속 자식에 EditBox + ScrollFrame 둘 다 존재.
-- (특성/구역 선택 팝업이 이 구조 — 일반 다이얼로그 오탐 방지)
local function _DDF_LooksLikePopup(frame)
    if not frame.GetChildren then return false end
    local ok, cs = pcall(function() return { frame:GetChildren() } end)
    if not ok or type(cs) ~= "table" then return false end
    local hasEdit, hasScroll = false, false
    for _, c in ipairs(cs) do
        local tok, ot = pcall(function() return c and c.GetObjectType and c:GetObjectType() end)
        if tok then
            if ot == "EditBox" then hasEdit = true
            elseif ot == "ScrollFrame" then hasScroll = true end
        end
    end
    return hasEdit and hasScroll
end

-- UIParent 자식 중 검색형 드롭다운 팝업을 찾아 OnShow 후크 설치 + 즉시 적용.
-- 이미 처리한 팝업(_ddfPopups)은 즉시 skip → burst 마다 재호출돼도 저렴.
local function _DDF_Apply()
    if GetDB().ddItemFontMatch ~= true then return end
    if not (UIParent and UIParent.GetChildren) then return end
    local ok, kids = pcall(function() return { UIParent:GetChildren() } end)
    if not ok or type(kids) ~= "table" then return end
    for _, child in ipairs(kids) do
        if type(child) == "table" and not _ddfPopups[child] then
            local forbidden = (child.IsForbidden and child:IsForbidden())
            local okT, isFS = pcall(function() return child:GetFrameStrata() == "FULLSCREEN_DIALOG" end)
            if not forbidden and okT and isFS
               and _DDF_LooksLikePopup(child) then
                _ddfPopups[child] = true
                _DDF_WalkBump(child, 0)
                if child.HookScript then
                    pcall(child.HookScript, child, "OnShow", function(self)
                        if GetDB().ddItemFontMatch == true then _DDF_WalkBump(self, 0) end
                    end)
                end
            end
        end
    end
end
do
    _G.EUIKR_ApplyDropdownFonts = _DDF_Apply  -- Core.lua burst 스캔에서 호출
end

-- 토글 OFF → 원래 크기 복원
local function _DDF_Restore()
    for fs, origSz in pairs(_ddfFS) do
        if fs and fs.GetFont and fs.SetFont then
            local ok, f, _, fl = pcall(fs.GetFont, fs)
            if ok and f then pcall(fs.SetFont, fs, f, origSz, fl or "") end
        end
    end
    wipe(_ddfFS)
end

-- 이미 추적 중인 모든 팝업에 현재 선택 크기 재적용 (크기 스텝 변경 시).
local function _DDF_ReapplySize()
    if GetDB().ddItemFontMatch ~= true then return end
    _DDF_Apply()
    for popup in pairs(_ddfPopups) do _DDF_WalkBump(popup, 0) end
end

-- K메뉴 토글 콜백 — 켜면 즉시 적용(이미 찾은 팝업도 재적용), 끄면 복원.
local function _DDF_OnToggle()
    if GetDB().ddItemFontMatch == true then
        _DDF_Apply()
        for popup in pairs(_ddfPopups) do _DDF_WalkBump(popup, 0) end
    else
        _DDF_Restore()
    end
end

if NS.RegisterSection then
    NS.RegisterSection({ order = 80, col = 1, row = 2, title = "드롭다운 목록 글자",
        desc = "특성알림 등 검색형 드롭다운 목록 글자 크기.",
        build = function(popup, descFS)
            local R = NS.RANGE.DDF
            local row, upd = NS.MakeStepperRow(popup, descFS, {
                get = function() return GetDB().ddItemFontSize or 13 end,
                set = function(v) GetDB().ddItemFontSize = v end,
                fmt = function(v) return string.format("크기 %dpx", v) end,
                min = R[1], max = R[2], step = R[3],
                onChange = function() pcall(_DDF_ReapplySize) end,
            })
            local function refresh() if GetDB().ddItemFontMatch == true then row:Show() else row:Hide() end end
            local sw = MakeSwitch(descFS, -10, "사용", "ddItemFontMatch", function() pcall(_DDF_OnToggle); refresh() end)
            sw:ClearAllPoints(); sw:SetPoint("LEFT", row, "RIGHT", 12, 0)
            refresh()
        end })
end
if NS.RegisterInstall then
    NS.RegisterInstall(function() pcall(_DDF_OnToggle) end)
end
