-------------------------------------------------------------------------------
--  EllesmereUI_koKR_Plus / Nameplates.lua
--  이름표 전체 Y 오프셋(위/아래 이동) + 이름표 cog 팝업 배율/번역 처리.
--  EllesmereNameplates_NS 가 없으면(이름표 모듈 비활성) 전부 무동작.
-------------------------------------------------------------------------------
---@diagnostic disable: undefined-global
local NS = _G.EUIKorPlus
if not NS then return end
local GetDB = NS.GetDB
local ApplyNameplateExtraY                       -- forward
local function ApplyNameplateSettings() end      -- no-op (구 호환)
-- ── 이름표 추가 Y 오프셋 (위/아래 이동) ──
-- 엘스미어 원본은 plate 의 outer anchor 를 SetUnit 안에서
--   plate:SetPoint("CENTER", nameplate, "CENTER", 0, GetHitboxYShift())
-- 로 한 번 잡음. 우리는 사용자 지정 Y 를 *추가로* 더해 재앵커.
-- Reference: Platynator.Display.NameplateMixin:Install(nameplate, offsetY) 동일 패턴.
local function _NP_RepositionPlate(plate)
    if type(plate) ~= "table" then return end
    if not plate.nameplate or not plate.SetPoint then return end
    local ns = _G.EllesmereNameplates_NS
    local base = (ns and ns.GetHitboxYShift and ns.GetHitboxYShift()) or 0
    local extra = (GetDB().npExtraY) or 0
    pcall(plate.ClearAllPoints, plate)
    pcall(plate.SetPoint, plate, "CENTER", plate.nameplate, "CENTER", 0, base + extra)
end

ApplyNameplateExtraY = function()
    local ns = _G.EllesmereNameplates_NS
    if not ns or type(ns.plates) ~= "table" then return end
    for _, plate in pairs(ns.plates) do _NP_RepositionPlate(plate) end
end

-- ── 이름표 cog popup 별도 처리 ──
-- EUI_Nameplates_Options.lua 의 ShowCogPopup 은 EllesmereUI.BuildCogPopup 이
-- 아닌 *로컬 함수* 로 popup 생성. 그래서 우리 BuildCogPopup wrap·_popupFrames
-- 등록·번역이 모두 안 닿음. 거기 popup 은 다음 distinctive 마커가 있음:
--   pf._titleFS, pf._xTrack, pf._yTrack  (없으면 다른 popup)
-- UIParent 익명 DIALOG strata 자식 중 이 마커 보유한 것만 발견 후크.
local _npCogHooked = setmetatable({}, { __mode = "k" })
local function _NPCog_Process(pf)
    if not pf or _npCogHooked[pf] then return end
    if not (pf._titleFS and pf._xTrack and pf._yTrack) then return end  -- 마커 미일치
    _npCogHooked[pf] = true
    -- (1) widget scale 적용
    local s = (_G.EllesmereUI and _G.EllesmereUI.GetPopupScale and _G.EllesmereUI.GetPopupScale()) or 1
    pcall(pf.SetScale, pf, s)
    -- (2) 모든 자식 FontString 번역 (Core.lua ScanFrameRecursive 와 동일 효과)
    if _G.EllesmereUI_KR_Scan then pcall(_G.EllesmereUI_KR_Scan, pf) end
    -- (3) OnShow 재발화 시 scale 재적용 (사용자가 widgetScale 변경했을 수 있음)
    if pf.HookScript and not pf.__cimNPCogShowHook then
        pf.__cimNPCogShowHook = true
        pcall(pf.HookScript, pf, "OnShow", function(self)
            local s2 = (_G.EllesmereUI and _G.EllesmereUI.GetPopupScale and _G.EllesmereUI.GetPopupScale()) or 1
            pcall(self.SetScale, self, s2)
        end)
    end
end

local function _NPCog_Scan()
    if not (UIParent and UIParent.GetChildren) then return end
    for _, child in ipairs({ UIParent:GetChildren() }) do
        if type(child) == "table" then _NPCog_Process(child) end
    end
end

-- 새 이름표가 활성화될 때마다 적용 (NAME_PLATE_UNIT_ADDED).
-- 원본 핸들러가 ns.plates[unit] 를 채울 시간 확보 위해 C_Timer.After(0) 지연
-- (Locale/Nameplates.lua 의 ShowInterrupted 후크와 같은 패턴).
do
    local f = CreateFrame("Frame")
    f:RegisterEvent("NAME_PLATE_UNIT_ADDED")
    f:SetScript("OnEvent", function(_, _, unit)
        ApplyNameplateSettings()
        if unit and C_Timer and C_Timer.After then
            C_Timer.After(0, function()
                local ns = _G.EllesmereNameplates_NS
                if ns and ns.plates then _NP_RepositionPlate(ns.plates[unit]) end
            end)
        end
    end)
end

-- ============================================================
--  팝업 섹션 + 진입점 등록
-- ============================================================
if NS.RegisterSection then
    NS.RegisterSection({
        order = 10, col = 0, row = 0, title = "이름표 위치 (위/아래)",
        desc  = "이름표 전체를 픽셀 단위 위/아래 이동 (+위, -아래).",
        build = function(popup, descFS)
            local R = NS.RANGE.NP_Y
            NS.MakeStepperRow(popup, descFS, {
                get = function() return GetDB().npExtraY or 0 end,
                set = function(v) GetDB().npExtraY = v end,
                fmt = function(v) return string.format("세로: %+d px", v) end,
                min = R[1], max = R[2], step = R[3],
                onChange = ApplyNameplateExtraY, reset = 0,
            })
        end,
    })
end
if NS.RegisterInstall then
    NS.RegisterInstall(function()
        ApplyNameplateExtraY()
        _NPCog_Scan()
    end)
end
