-------------------------------------------------------------------------------
--  EllesmereUI_koKR_Plus / WidgetScale.lua
--  EUI 위젯 팝업(톱니/전문화/드롭다운 등) 추가 배율. GetPopupScale wrap + 기존
--  팝업 재적용. 툴팁 배율(TooltipScale)과 연동 — 그쪽 미로드면 자동 무시.
-------------------------------------------------------------------------------
---@diagnostic disable: undefined-global
local NS = _G.EUIKorPlus
if not NS then return end
local GetDB = NS.GetDB
local ApplyWidgetScale            -- forward (아래에서 정의)
-- ── 위젯 팝업 추가 배율 ──
-- EllesmereUI.GetPopupScale 을 wrap 해서 결과에 user widgetScale 곱하기.
-- 이후 EUI 가 만드는 모든 popup (BuildCogPopup / ShowSpecAssignPopup /
-- BuildVisOptsCBDropdown 메뉴) 가 자동으로 우리 배율 반영.
-- 이미 띄워진 popup 은 EllesmereUI._popupFrames 순회해서 SetScale 재적용.
local _origGetPopupScale
-- 칼모양 spec assign popup(EUISpecAssignPopup) 고정 배율. widgetScale 제외 대상.
local SPEC_ASSIGN_FIXED_SCALE = 0.9
_G.EllesmereUI_KR_ApplyWidgetScale = function() if ApplyWidgetScale then pcall(ApplyWidgetScale) end end

-- ★ BuildCursorAnchorRow 는 위젯 안에서 *로컬* BuildCogPopup 호출 → 우리 글로벌
--   wrap 못 거침 → 영문 깜빡임 발생. BuildCursorAnchorRow 호출 직후
--   _popupFrames 의 마지막 entry (방금 생성한 popup) 를 사전 스캔해 두면 user
--   가 cog 클릭 시 *이미 한글* 상태로 표시 → flicker 0.
-- PLAYER_LOGIN 시점에 호출 (파일 로드 시엔 EUI 가 아직 함수 노출 전일 수 있음).
local function _InstallCARHook()
    if not _G.EllesmereUI then return end
    if type(_G.EllesmereUI.BuildCursorAnchorRow) ~= "function" then return end
    if _G.EllesmereUI._koKR_carHooked then return end
    _G.EllesmereUI._koKR_carHooked = true
    hooksecurefunc(_G.EllesmereUI, "BuildCursorAnchorRow", function()
        local frames = _G.EllesmereUI._popupFrames
        if type(frames) ~= "table" then return end
        local entry = frames[#frames]
        if not entry or not entry.popup then return end
        local pf = entry.popup
        if _G.EllesmereUI.GetPopupScale then
            pcall(pf.SetScale, pf, _G.EllesmereUI.GetPopupScale())
        end
        if _G.EllesmereUI_KR_Scan then pcall(_G.EllesmereUI_KR_Scan, pf) end
    end)
end

-- spec assign popup/dimmer 의 SetScale 을 후크해 원본이 widgetScale 값으로 바꾸면
-- 즉시 고정값으로 되돌림(재진입 가드). 첫 표시 때 "커졌다 작아짐" 깜빡임 제거.
-- (EUISpecAssignPopup/Dimmer 는 애드온 소유 frame → 필드/후크 직접 적용 안전.)
local function _lockSpecScale(frame, want)
    if not frame or not frame.SetScale then return end
    if not frame.__cimSpecScaleLock then
        frame.__cimSpecScaleLock = true
        hooksecurefunc(frame, "SetScale", function(self, s)
            if self.__cimSpecScaleReent then return end
            if math.abs((s or 1) - want) > 0.001 then
                self.__cimSpecScaleReent = true
                pcall(self.SetScale, self, want)
                self.__cimSpecScaleReent = false
            end
        end)
    end
    pcall(frame.SetScale, frame, want)
end

ApplyWidgetScale = function()
    if not _G.EllesmereUI then return end
    -- 칼모양 spec assign popup scale 잠금 후크 (1회) — 생성/표시 시점 깜빡임 차단.
    if not _G.EllesmereUI.__cimSpecScaleHook and type(_G.EllesmereUI.ShowSpecAssignPopup) == "function" then
        _G.EllesmereUI.__cimSpecScaleHook = true
        hooksecurefunc(_G.EllesmereUI, "ShowSpecAssignPopup", function()
            _lockSpecScale(_G.EUISpecAssignDimmer, 1.0)
            _lockSpecScale(_G.EUISpecAssignPopup, SPEC_ASSIGN_FIXED_SCALE)
        end)
    end
    if not _origGetPopupScale and type(_G.EllesmereUI.GetPopupScale) == "function" then
        _origGetPopupScale = _G.EllesmereUI.GetPopupScale
        _G.EllesmereUI.GetPopupScale = function(...)
            local base = _origGetPopupScale(...) or 1
            return base * ((GetDB().widgetScale) or 1.0)
        end
    end
    -- 툴팁도 같은 widgetScale 적용 (TooltipScale 미로드면 무시 — 가드 전역).
    if _G.EllesmereUI_KR_ApplyTipScale then pcall(_G.EllesmereUI_KR_ApplyTipScale) end
    -- 모든 EUI popup 에 OnShow 후크 (1회) → popup 표시 *즉시* SetScale + 번역.
    -- (BuildCursorAnchorRow 처럼 *로컬* BuildCogPopup 호출은 우리 wrap 을 안 거쳐서
    --  title/labels 가 영문으로 남음. OnShow 마다 ScanFrameRecursive 로 통째 번역.)
    local frames = _G.EllesmereUI._popupFrames
    if type(frames) == "table" then
        for _, entry in ipairs(frames) do
            local pf = entry.popup
            if pf and pf.SetScale then
                -- ★ 칼모양 spec assign popup(EUISpecAssignPopup)만 widgetScale 제외.
                --   식별: _popupFrames entry 중 dimmer 필드 보유( = {popup,dimmer} ) 또는
                --   전역명 EUISpecAssignPopup. 이 popup 은 부모(dimmer)도 SetScale 되어
                --   화면 크기가 widgetScale 제곱으로 커짐 → dimmer 1.0 + popup 0.9 고정.
                local isSpecAssign = (pf == _G.EUISpecAssignPopup) or (entry.dimmer ~= nil)
                local dimmer = entry.dimmer
                local function applyScale(p)
                    if isSpecAssign then
                        if dimmer and dimmer.SetScale then pcall(dimmer.SetScale, dimmer, 1.0) end
                        pcall(p.SetScale, p, SPEC_ASSIGN_FIXED_SCALE)
                    else
                        local s = _G.EllesmereUI.GetPopupScale and _G.EllesmereUI.GetPopupScale() or 1
                        pcall(p.SetScale, p, s)
                    end
                end
                applyScale(pf)                     -- 즉시 1회
                if _G.EllesmereUI_KR_Scan then pcall(_G.EllesmereUI_KR_Scan, pf) end
                -- OnShow 후크 (1회 설치 — 가드 플래그)
                if pf.HookScript and not pf.__cimWSShowHook then
                    pf.__cimWSShowHook = true
                    pcall(pf.HookScript, pf, "OnShow", function(self)
                        applyScale(self)
                        if _G.EllesmereUI_KR_Scan then pcall(_G.EllesmereUI_KR_Scan, self) end
                    end)
                end
            end
        end
    end
end

-- ============================================================
--  EUI 페이지 전환 시 위젯 배율 재적용 후크 (1회 설치).
--  (구 InstallFontHooks — 외곽선/폰트 옵션 제거 후 위젯 배율 재적용 전용.)
-- ============================================================
local function InstallFontHooks()
    if not EllesmereUI or EllesmereUI.__cimAdditionsHooked then return end
    EllesmereUI.__cimAdditionsHooked = true
    local function reapplyDeferred()
        pcall(ApplyWidgetScale)                         -- 즉시 1회 (OnShow 후크 설치 핵심)
        if not C_Timer or not C_Timer.After then return end
        C_Timer.After(0.05, ApplyWidgetScale)
        C_Timer.After(0.30, ApplyWidgetScale)
    end
    if type(EllesmereUI.SelectPage)   == "function" then hooksecurefunc(EllesmereUI, "SelectPage",   reapplyDeferred) end
    if type(EllesmereUI.SelectModule) == "function" then hooksecurefunc(EllesmereUI, "SelectModule", reapplyDeferred) end
    if type(EllesmereUI.RefreshPage)  == "function" then hooksecurefunc(EllesmereUI, "RefreshPage",  reapplyDeferred) end
    if type(EllesmereUI.Show)   == "function" then hooksecurefunc(EllesmereUI, "Show",   reapplyDeferred) end
    if type(EllesmereUI.Toggle) == "function" then hooksecurefunc(EllesmereUI, "Toggle", reapplyDeferred) end
end

-- ============================================================
--  팝업 섹션 + 진입점 등록
-- ============================================================
if NS.RegisterSection then
    NS.RegisterSection({
        order = 40, col = 1, row = 0, title = "위젯 팝업 배율",
        desc  = "톱니/전문화/드롭다운 등 위젯 팝업 추가 배율.",
        build = function(popup, descFS)
            local R = NS.RANGE.WS
            NS.MakeStepperRow(popup, descFS, {
                get = function() return GetDB().widgetScale or 1.0 end,
                set = function(v) GetDB().widgetScale = v end,
                fmt = function(v) return string.format("배율 %.2fx", v) end,
                min = R[1], max = R[2], step = R[3],
                onChange = ApplyWidgetScale, reset = 1.0,
            })
        end,
    })
end
if NS.RegisterInstall then
    NS.RegisterInstall(function()
        InstallFontHooks()
        if _InstallCARHook then _InstallCARHook() end
        ApplyWidgetScale()
    end)
end
