-- ============================================================
--  EllesmereUI_koKR_MinimapPin — 미니맵 핀/아이콘 배율 (개인용)
--  EUI 메인 프레임 우상단에 "추가 기능" 버튼 왼쪽에 [핀 크기] 버튼 추가.
--  버튼 클릭 시 자체 팝업으로 토글/배율 설정.
--  원본 EUI / EllesmereUI_koKR 파일 절대 수정 안 함.
-- ============================================================

local SV_NAME    = "EllesmereUIKorMinimapPinDB"

-- ────────── DB ──────────
local DEFAULTS = {
    enabled = false,
    step = 0,   -- 아이콘 크기 단계 (-5~+5, 0=기본). 슬라이더로 조절
    -- (구 Additions 미니맵 도메인 — 우클릭 메뉴 + 마이크로메뉴 배율)
    minimapRightClick = true,   -- 미니맵 우클릭 → micro menu
    microMenuScale    = 1.0,    -- 미니맵 micro menu SetScale (0.8~2.0)
}
local MM_SCALE_MIN, MM_SCALE_MAX, MM_SCALE_STEP = 0.8, 2.0, 0.05
-- 배율 = (1 + mapSize/BASE_DIVISOR) + step×STEP_DELTA  (step 0 = 기본, 단계당 ±0.1배 대칭)
local BASE_DIVISOR, STEP_DELTA = 400, 0.1
local STEP_MIN, STEP_MAX = -10, 10
local SCALE_MAX = 10.0   -- 자동 배율 상한

local function GetDB()
    _G[SV_NAME] = _G[SV_NAME] or {}
    local db = _G[SV_NAME]
    for k, v in pairs(DEFAULTS) do
        if db[k] == nil then db[k] = v end
    end
    return db
end

-- 기존 EllesmereUIKorAdditionsDB 에서 값 마이그레이션 (한 번만)
local function MigrateFromAdditions()
    local src = _G.EllesmereUIKorAdditionsDB
    local db = GetDB()
    if not src or db._migrated then return end
    if src.minimapPinScaleEnabled ~= nil then db.enabled = src.minimapPinScaleEnabled end
    -- 미니맵 우클릭/마이크로메뉴 배율도 미니맵 도메인으로 이전 (구 Additions DB).
    if src.minimapRightClick ~= nil then db.minimapRightClick = src.minimapRightClick end
    if src.microMenuScale    ~= nil then db.microMenuScale    = src.microMenuScale end
    db._migrated = true
end

-- ────────── 공용 헬퍼 (Additions.lua 와 독립) ──────────
local POPUP_MAIN_BG  = { 0.12, 0.13, 0.15, 1 }
local POPUP_TITLE_BG = { 0.17, 0.18, 0.20, 1 }
local POPUP_BTN_BG   = { 0.01, 0.02, 0.03, 1 }

local function GetFont()
    return "Fonts\\2002.TTF"   -- 추가기능 글자는 모두 클라 한글 폰트 (Expressway 는 한글 글리프 없음)
end

local function MakeFont(parent, size, flags, r, g, b)
    local fs = parent:CreateFontString(nil, "OVERLAY")
    fs:SetFont(GetFont(), size or 12, flags or "")
    fs:SetTextColor(r or 1, g or 1, b or 1, 1)
    return fs
end

local function SolidTex(parent, layer, r, g, b, a)
    local t = parent:CreateTexture(nil, layer or "BACKGROUND")
    t:SetColorTexture(r, g, b, a or 1)
    return t
end

local function MakeBorder(frame, r, g, b, a)
    a = a or 1
    local borders = {}
    local function side(point1, point2, w, h)
        local t = frame:CreateTexture(nil, "OVERLAY")
        t:SetColorTexture(r, g, b, a)
        if w then t:SetHeight(h or 1); t:SetPoint(point1); t:SetPoint(point2) end
        return t
    end
    -- top/bottom/left/right
    local top = frame:CreateTexture(nil, "OVERLAY")
    top:SetColorTexture(r, g, b, a); top:SetHeight(1)
    top:SetPoint("TOPLEFT"); top:SetPoint("TOPRIGHT")
    local bot = frame:CreateTexture(nil, "OVERLAY")
    bot:SetColorTexture(r, g, b, a); bot:SetHeight(1)
    bot:SetPoint("BOTTOMLEFT"); bot:SetPoint("BOTTOMRIGHT")
    local lft = frame:CreateTexture(nil, "OVERLAY")
    lft:SetColorTexture(r, g, b, a); lft:SetWidth(1)
    lft:SetPoint("TOPLEFT"); lft:SetPoint("BOTTOMLEFT")
    local rgt = frame:CreateTexture(nil, "OVERLAY")
    rgt:SetColorTexture(r, g, b, a); rgt:SetWidth(1)
    rgt:SetPoint("TOPRIGHT"); rgt:SetPoint("BOTTOMRIGHT")
    borders.top, borders.bot, borders.lft, borders.rgt = top, bot, lft, rgt
    return borders
end

local function SetBorderColor(borders, r, g, b, a)
    a = a or 1
    for _, t in pairs(borders) do t:SetColorTexture(r, g, b, a) end
end

-- 토글 스위치
local function MakeSwitch(parent, anchor, yoff, label, key, onChange)
    local EUI = _G.EllesmereUI
    local gC  = (EUI and EUI.ELLESMERE_GREEN) or { r = 0.05, g = 0.82, b = 0.61 }
    local TW, TH, PAD = 40, 20, 2
    local KN  = TH - PAD * 2

    local row = CreateFrame("Button", nil, parent)
    row:SetSize(220, 22)
    row:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", 0, yoff)
    local lb = MakeFont(row, 11, nil, 0.9, 0.9, 0.95)
    lb:SetPoint("LEFT", row, "LEFT", 0, 0)
    lb:SetText(label)

    local sw = CreateFrame("Frame", nil, row)
    sw:SetSize(TW, TH)
    sw:SetPoint("LEFT", row, "LEFT", 150, 0)
    local tBg = SolidTex(sw, "BACKGROUND", 0.267, 0.267, 0.267, 0.65)
    tBg:SetAllPoints()
    local knob = sw:CreateTexture(nil, "ARTWORK")
    knob:SetSize(KN, KN)

    local function _upd()
        knob:ClearAllPoints()
        if GetDB()[key] ~= false then
            tBg:SetColorTexture(gC.r, gC.g, gC.b, 0.75)
            knob:SetPoint("RIGHT", sw, "RIGHT", -PAD, 0)
            knob:SetColorTexture(1, 1, 1, 1)
        else
            tBg:SetColorTexture(0.267, 0.267, 0.267, 0.65)
            knob:SetPoint("LEFT", sw, "LEFT", PAD, 0)
            knob:SetColorTexture(1, 1, 1, 0.5)
        end
    end
    row:SetScript("OnEnter", function() lb:SetTextColor(1, 1, 1) end)
    row:SetScript("OnLeave", function() lb:SetTextColor(0.9, 0.9, 0.95) end)
    row:SetScript("OnClick", function()
        local db = GetDB()
        db[key] = (db[key] == false) and true or false
        _upd()
        if onChange then onChange() end
    end)
    _upd()
    return row
end

-- 스텝 버튼 (◀ / ▶)
local function MakeStepBtn(parent, side, label, onClick)
    local b = CreateFrame("Button", nil, parent)
    b:SetSize(24, 22)
    if side == "LEFT" then b:SetPoint("LEFT", parent, "LEFT", 2, 0)
    else b:SetPoint("RIGHT", parent, "RIGHT", -2, 0) end
    local bg = SolidTex(b, "BACKGROUND", POPUP_BTN_BG[1], POPUP_BTN_BG[2], POPUP_BTN_BG[3], POPUP_BTN_BG[4])
    bg:SetAllPoints()
    local fs = MakeFont(b, 13, "OUTLINE", 0.85, 0.85, 0.9)
    fs:SetPoint("CENTER"); fs:SetText(label)
    b:SetScript("OnEnter", function() bg:SetColorTexture(0.2, 0.4, 0.6, 0.8) end)
    b:SetScript("OnLeave", function() bg:SetColorTexture(POPUP_BTN_BG[1], POPUP_BTN_BG[2], POPUP_BTN_BG[3], POPUP_BTN_BG[4]) end)
    b:SetScript("OnClick", onClick)
    return b
end


-- ────────── 미니맵 핀 배율 로직 (Additions.lua 의 _MMP_* 복제) ──────────
local _mmpApplying = false
local _mmpCapturedSize = nil
local _mmpHookInstalled = false
local _baseOffset = nil   -- EUI 원본 미니맵 앵커 {point, rel, relPoint, x, y}

local function _GetMapSize()
    if _mmpCapturedSize and _mmpCapturedSize > 10 then return _mmpCapturedSize end
    local EUI = _G.EllesmereUI
    local Lite = EUI and EUI.Lite
    local addon = Lite and Lite.GetAddon and Lite.GetAddon("EllesmereUIMinimap", true)
    local prof = addon and addon.db and addon.db.profile
    if prof and prof.minimap and type(prof.minimap.mapSize) == "number" then
        return prof.minimap.mapSize
    end
    return 140
end

-- EUI 잠금해제(EllesmereUnlockMode) 또는 Blizzard 편집모드 활성 여부.
local function _IsUnlocked()
    local um = _G.EllesmereUnlockMode
    local ok, sh = pcall(function() return um and um:IsShown() end)
    if ok and sh then return true end
    local emf = _G.EditModeManagerFrame
    local ok2, a = pcall(function() return emf and emf.IsEditModeActive and emf:IsEditModeActive() end)
    return (ok2 and a) or false
end

local function Apply()
    local mm = _G.Minimap
    if not mm or not mm.SetScale then return end
    local db = GetDB()
    local sz = _GetMapSize()
    -- 체크(enabled) 시: 미니맵 크기(mapSize)에 비례한 자동 배율.
    local s = 1.0
    if db.enabled then
        local stepN = db.step or 0
        local delta = (stepN < 0) and (STEP_DELTA * 2) or STEP_DELTA   -- 작아지는 쪽(-) 폭 2배
        s = (1.0 + sz / BASE_DIVISOR) + stepN * delta
        if s < 0.5 then s = 0.5 elseif s > SCALE_MAX then s = SCALE_MAX end
    end
    -- 본체(둥근 지도)는 mapSize 유지(SetSize sz/s × SetScale s = sz), 아이콘만 s 배.
    -- SetScale 이 위치 offset 도 ×s 시키므로 원본 offset 캡처 후 offset/s 보정 → 위치 고정.
    if not _baseOffset then
        local n = mm:GetNumPoints() or 0
        if n > 0 then _baseOffset = { mm:GetPoint(1) } end
    end
    _mmpApplying = true
    mm:SetSize(sz / s, sz / s)
    mm:SetScale(s)
    if _baseOffset and _baseOffset[1] and not _IsUnlocked() then
        mm:ClearAllPoints()
        mm:SetPoint(_baseOffset[1], _baseOffset[2], _baseOffset[3],
                    (_baseOffset[4] or 0) / s, (_baseOffset[5] or 0) / s)
    end
    _mmpApplying = false
end

local function InstallHook()
    if _mmpHookInstalled or not Minimap or not Minimap.SetSize then return end
    _mmpHookInstalled = true
    hooksecurefunc(Minimap, "SetSize", function(self, w, h)
        if _mmpApplying then return end
        if w and w > 10 then _mmpCapturedSize = w end
        if not GetDB().enabled then return end
        Apply()        -- mapSize 변경 등 → 자동 배율 재계산 + 즉시 보정(깜빡임 방지)
    end)
    hooksecurefunc(Minimap, "SetScale", function(self, value)
        if _mmpApplying then return end
        if not GetDB().enabled then return end
        Apply()   -- EUI 가 scale 을 1.0 으로 되돌리면 자동 배율 재적용
    end)
    hooksecurefunc(Minimap, "SetPoint", function(self)
        if _mmpApplying then return end
        if _IsUnlocked() then return end   -- 편집모드 드래그는 건드리지 않음(자유 이동)
        _baseOffset = nil          -- EUI 가 미니맵 위치 변경 → 원본 offset 재캡처
        if GetDB().enabled then Apply() end
    end)
end

-- ────────── 팝업 ──────────
local _popup, _dimmer
local function CreatePopup()
    if _popup then return _popup, _dimmer end

    _dimmer = CreateFrame("Frame", nil, UIParent)
    _dimmer:SetAllPoints(UIParent)
    _dimmer:SetFrameStrata("FULLSCREEN_DIALOG")
    _dimmer:EnableMouse(true)
    local dimTex = SolidTex(_dimmer, "BACKGROUND", 0, 0, 0, 0.5)
    dimTex:SetAllPoints()
    _dimmer:Hide()
    _dimmer:SetScript("OnMouseDown", function(_, btn) if btn == "RightButton" then _dimmer:Hide() end end)
    _dimmer:SetScript("OnKeyDown", function(self, key) if key == "ESCAPE" then self:Hide() end end)
    _dimmer:SetPropagateKeyboardInput(true)
    _dimmer:EnableKeyboard(true)

    _popup = CreateFrame("Frame", nil, _dimmer)
    _popup:SetSize(420, 300)
    _popup:SetPoint("CENTER")
    _popup:SetFrameStrata("FULLSCREEN_DIALOG")
    local bg = SolidTex(_popup, "BACKGROUND", POPUP_MAIN_BG[1], POPUP_MAIN_BG[2], POPUP_MAIN_BG[3], POPUP_MAIN_BG[4])
    bg:SetAllPoints()
    MakeBorder(_popup, 0.4, 0.6, 0.85, 0.7)

    -- 타이틀
    local titleBar = CreateFrame("Frame", nil, _popup)
    titleBar:SetHeight(28)
    titleBar:SetPoint("TOPLEFT", _popup, "TOPLEFT", 0, 0)
    titleBar:SetPoint("TOPRIGHT", _popup, "TOPRIGHT", 0, 0)
    SolidTex(titleBar, "BACKGROUND", POPUP_TITLE_BG[1], POPUP_TITLE_BG[2], POPUP_TITLE_BG[3], POPUP_TITLE_BG[4]):SetAllPoints()
    local title = MakeFont(titleBar, 13, "OUTLINE", 0.9, 0.95, 1)
    title:SetPoint("CENTER")
    title:SetText("미니맵 (개인용)")

    -- 설명
    local desc = MakeFont(_popup, 10, nil, 0.6, 0.6, 0.65)
    desc:SetPoint("TOPLEFT", _popup, "TOPLEFT", 16, -42)
    desc:SetWidth(388)
    desc:SetWordWrap(true)
    desc:SetText("체크하면 미니맵 크기(mapSize)에 비례해 내부 POI(추적/퀘스트 아이콘)가 자동으로 커집니다. |cffffaa66미니맵 위치가 약간 이동할 수 있음|r.")

    -- 토글 (체크 시 mapSize 비례 자동 배율) — 체크해야 아래 크기조정 행이 나타남
    local _refreshPinUI
    local sw = MakeSwitch(_popup, desc, -16, "핀 크기 조정", "enabled", function()
        Apply()
        if _refreshPinUI then _refreshPinUI() end
    end)

    -- 아이콘 크기 ◀▶ 조절 (단계 STEP_MIN~STEP_MAX, 0=기본 / 양수 크게 / 음수 작게)
    local sizeRow = CreateFrame("Frame", nil, _popup)
    sizeRow:SetSize(150, 24)
    sizeRow:SetPoint("TOPLEFT", sw, "BOTTOMLEFT", 0, -14)
    sizeRow:SetFrameLevel((_popup:GetFrameLevel() or 0) + 10)
    SolidTex(sizeRow, "BACKGROUND", POPUP_BTN_BG[1], POPUP_BTN_BG[2], POPUP_BTN_BG[3], POPUP_BTN_BG[4]):SetAllPoints()
    local sizeVal = MakeFont(sizeRow, 12, nil, 0.9, 0.9, 0.95)
    sizeVal:SetPoint("CENTER")
    local function _updSize()
        local v = GetDB().step or 0
        sizeVal:SetText("크기 단계  " .. (v > 0 and ("+" .. v) or tostring(v)))
    end
    local lBtn = MakeStepBtn(sizeRow, "LEFT", "◀", function()   -- 작게
        local db = GetDB(); db.step = math.max(STEP_MIN, (db.step or 0) - 1)
        Apply(); _updSize()
    end)
    local rBtn = MakeStepBtn(sizeRow, "RIGHT", "▶", function()  -- 크게
        local db = GetDB(); db.step = math.min(STEP_MAX, (db.step or 0) + 1)
        Apply(); _updSize()
    end)
    lBtn:SetFrameLevel(sizeRow:GetFrameLevel() + 1)
    rBtn:SetFrameLevel(sizeRow:GetFrameLevel() + 1)
    _updSize()

    -- 체크 상태에 따라 핀 크기조정 행 표시/숨김 (끄면 숨김)
    _refreshPinUI = function()
        if GetDB().enabled then sizeRow:Show() else sizeRow:Hide() end
    end
    _refreshPinUI()

    -- ── 미니맵 마이크로메뉴 배율 (구 Additions — 미니맵 도메인) ──
    local mmRow = CreateFrame("Frame", nil, _popup)
    mmRow:SetSize(150, 24)
    mmRow:SetPoint("TOPLEFT", sizeRow, "BOTTOMLEFT", 0, -14)
    mmRow:SetFrameLevel((_popup:GetFrameLevel() or 0) + 10)
    SolidTex(mmRow, "BACKGROUND", POPUP_BTN_BG[1], POPUP_BTN_BG[2], POPUP_BTN_BG[3], 1):SetAllPoints()
    local mmVal = MakeFont(mmRow, 12, nil, 0.9, 0.9, 0.95)
    mmVal:SetPoint("CENTER")
    local function _updMM() mmVal:SetText(string.format("우클릭 메뉴 배율  %.2fx", GetDB().microMenuScale or 1.0)) end
    local mL = MakeStepBtn(mmRow, "LEFT", "◀", function()
        local db = GetDB(); db.microMenuScale = math.max(MM_SCALE_MIN, (db.microMenuScale or 1.0) - MM_SCALE_STEP)
        if _G.EllesmereUIKorMinimap_ApplyMicroScale then _G.EllesmereUIKorMinimap_ApplyMicroScale() end
        _updMM()
    end)
    local mR = MakeStepBtn(mmRow, "RIGHT", "▶", function()
        local db = GetDB(); db.microMenuScale = math.min(MM_SCALE_MAX, (db.microMenuScale or 1.0) + MM_SCALE_STEP)
        if _G.EllesmereUIKorMinimap_ApplyMicroScale then _G.EllesmereUIKorMinimap_ApplyMicroScale() end
        _updMM()
    end)
    mL:SetFrameLevel(mmRow:GetFrameLevel() + 1)
    mR:SetFrameLevel(mmRow:GetFrameLevel() + 1)
    _updMM()

    -- ── 미니맵 우클릭 → micro menu 토글 ──
    local rcSw = MakeSwitch(_popup, mmRow, -14, "우클릭 메뉴", "minimapRightClick", function()
        if _G.EllesmereUIKorMinimap_ApplyRightClick then _G.EllesmereUIKorMinimap_ApplyRightClick() end
    end)

    -- 닫기 버튼
    local closeBtn = CreateFrame("Button", nil, _popup)
    closeBtn:SetSize(100, 26)
    closeBtn:SetPoint("BOTTOM", _popup, "BOTTOM", 0, 16)
    local closeBg = SolidTex(closeBtn, "BACKGROUND", POPUP_BTN_BG[1], POPUP_BTN_BG[2], POPUP_BTN_BG[3], POPUP_BTN_BG[4])
    closeBg:SetAllPoints()
    MakeBorder(closeBtn, 0.5, 0.7, 1.0, 0.6)
    local closeLbl = MakeFont(closeBtn, 12, "OUTLINE", 1, 1, 1)
    closeLbl:SetPoint("CENTER")
    closeLbl:SetText("닫기")
    closeBtn:SetScript("OnEnter", function() closeBg:SetColorTexture(0.25, 0.55, 0.85, 0.95) end)
    closeBtn:SetScript("OnLeave", function() closeBg:SetColorTexture(POPUP_BTN_BG[1], POPUP_BTN_BG[2], POPUP_BTN_BG[3], POPUP_BTN_BG[4]) end)
    closeBtn:SetScript("OnClick", function() _dimmer:Hide() end)

    return _popup, _dimmer
end

local function TogglePopup()
    local p, d = CreatePopup()
    if d:IsShown() then
        d:Hide()
    else
        -- 추가기능(widgetScale)처럼 EUI 팝업 비율을 핀 크기 팝업에도 적용
        local sc = (_G.EllesmereUI and _G.EllesmereUI.GetPopupScale and _G.EllesmereUI.GetPopupScale()) or 1
        if p and p.SetScale and type(sc) == "number" and sc > 0 then pcall(p.SetScale, p, sc) end
        d:Show()
    end
end

-- ────────── 메인 프레임 우상단 버튼 ("추가 기능" 왼쪽) ──────────
local function InstallButton()
    local mf = _G.EllesmereUI and _G.EllesmereUI._mainFrame
    if not mf or mf.__mmPinBtn then return end
    local clickArea = _G.EllesmereUIClickArea
    if not clickArea then return end

    -- "추가 기능" 버튼: TOPRIGHT (-59, -11), size 76x38
    -- → 왼쪽 위치 = TOPRIGHT (-59 - 76 - 4, -11) = (-139, -11)
    local btn = CreateFrame("Button", nil, clickArea)
    btn:SetSize(76, 38)
    btn:SetPoint("TOPRIGHT", clickArea, "TOPRIGHT", -139, -11)
    btn:SetFrameLevel(clickArea:GetFrameLevel() + 21)
    mf.__mmPinBtn = btn

    local bg = SolidTex(btn, "BACKGROUND", 0.08, 0.10, 0.14, 0.30)
    bg:SetAllPoints()
    local borders = MakeBorder(btn, 0.5, 0.7, 1.0, 0.45)

    local fs = btn:CreateFontString(nil, "OVERLAY")
    fs:SetFont(GetFont(), 13, "OUTLINE")
    fs:SetPoint("CENTER")
    fs:SetText("|cff0091ed미니맵|r")

    btn:SetScript("OnEnter", function()
        bg:SetColorTexture(0.15, 0.20, 0.30, 0.55)
        SetBorderColor(borders, 0.5, 0.7, 1.0, 1)
        GameTooltip:SetOwner(btn, "ANCHOR_TOP")
        GameTooltip:AddLine("미니맵 (개인용)", 0.4, 0.7, 1)
        GameTooltip:AddLine("핀 크기 · 마이크로메뉴 배율 · 우클릭 메뉴.", 0.7, 0.7, 0.7, true)
        GameTooltip:Show()
    end)
    btn:SetScript("OnLeave", function()
        bg:SetColorTexture(0.08, 0.10, 0.14, 0.30)
        SetBorderColor(borders, 0.5, 0.7, 1.0, 0.45)
        GameTooltip:Hide()
    end)
    btn:SetScript("OnClick", TogglePopup)
end

local _showHooked = false
local function TryInstallButton()
    if not (_G.EllesmereUI and _G.EllesmereUI._mainFrame and _G.EllesmereUIClickArea) then return false end
    local mf, clickArea = _G.EllesmereUI._mainFrame, _G.EllesmereUIClickArea
    -- 메인 프레임이 생기면 OnShow 후크 1회 설치 → 메뉴를 열 때마다 버튼 재확인.
    -- (EUI 가 clickArea 를 재생성해 버튼이 떨어지거나, 폴링 종료 후 처음 메뉴를 열어도 즉시 재부착)
    if not _showHooked and mf.HookScript then
        _showHooked = true
        mf:HookScript("OnShow", function() TryInstallButton() end)
        -- 패널 표시 중에만 0.3초마다 확인 → 항상 보이게 보장. 닫으면 안 돎(사용량 0).
        local acc = 0
        mf:HookScript("OnUpdate", function(_, elapsed)
            acc = acc + (elapsed or 0)
            if acc < 0.3 then return end
            acc = 0
            TryInstallButton()
        end)
    end
    -- EUI 옵션창 열기/페이지 전환 시 재부착 + 지연 재확인 (clickArea 재생성 대응)
    local EUI = _G.EllesmereUI
    if EUI and not EUI.__mmPanelReattach then
        EUI.__mmPanelReattach = true
        local function deferred()
            TryInstallButton()
            if C_Timer and C_Timer.After then
                C_Timer.After(0.05, TryInstallButton)
                C_Timer.After(0.20, TryInstallButton)
            end
        end
        if type(EUI.Show)        == "function" then hooksecurefunc(EUI, "Show",        deferred) end
        if type(EUI.Toggle)      == "function" then hooksecurefunc(EUI, "Toggle",      deferred) end
        if type(EUI.SelectPage)  == "function" then hooksecurefunc(EUI, "SelectPage",  deferred) end
        if type(EUI.RefreshPage) == "function" then hooksecurefunc(EUI, "RefreshPage", deferred) end
    end
    local btn = mf.__mmPinBtn
    if btn and btn:GetParent() == clickArea then
        if btn.IsShown and not btn:IsShown() and btn.Show then btn:Show() end
        return true
    end
    mf.__mmPinBtn = nil
    InstallButton()
    return mf.__mmPinBtn ~= nil
end

-- ────────── 미니맵 micro menu 배율 (구 Additions — 미니맵 도메인) ──────────
local function _MM_ApplyScale()
    -- 마이크로메뉴(EllesmereUIMicroMenu)는 메뉴를 처음 열 때 lazy 생성됨.
    -- 프레임이 있으면 즉시 적용 + OnShow 후크(1회)로 열 때마다 재적용 보장.
    local mm = _G.EllesmereUIMicroMenu
    if not mm or not mm.SetScale then return end
    local function apply()
        local s = GetDB().microMenuScale or 1.0
        if s < MM_SCALE_MIN then s = MM_SCALE_MIN elseif s > MM_SCALE_MAX then s = MM_SCALE_MAX end
        pcall(mm.SetScale, mm, s)
    end
    apply()
    if mm.HookScript and not mm.__mmScaleHook then
        mm.__mmScaleHook = true
        mm:HookScript("OnShow", apply)
    end
end

-- ────────── 미니맵 우클릭 → micro menu (구 Additions — 미니맵 도메인) ──────────
-- 본체 blocker 가 우클릭은 통과 → 그 위에 프레임을 깔아 우클릭만 캡처.
local _mmRightFrame
local function _MM_RightClick_Apply()
    local db = GetDB()
    local enabled = db.minimapRightClick ~= false
    if enabled then
        if not _mmRightFrame then
            local mm = _G.Minimap
            if not mm or not mm.GetFrameLevel then return end
            _mmRightFrame = CreateFrame("Frame", nil, mm)
            _mmRightFrame:SetAllPoints()
            _mmRightFrame:SetFrameLevel((mm:GetFrameLevel() or 0) + 20)
            if _mmRightFrame.SetPassThroughButtons then
                _mmRightFrame:SetPassThroughButtons("LeftButton", "MiddleButton")
            end
            _mmRightFrame:SetScript("OnMouseUp", function(_, btn)
                if btn ~= "RightButton" then return end
                local Lite = EllesmereUI and EllesmereUI.Lite
                local EBS = Lite and Lite.GetAddon
                            and Lite.GetAddon("EllesmereUIMinimap", true)
                if EBS and EBS._ToggleMicroMenu then
                    EBS._ToggleMicroMenu()
                    -- 메뉴가 막 생성/표시된 직후 배율 적용 (lazy 프레임 대응)
                    if C_Timer and C_Timer.After then C_Timer.After(0, _MM_ApplyScale) end
                end
            end)
        end
        if _mmRightFrame.SetMouseClickEnabled then
            _mmRightFrame:SetMouseClickEnabled(true)
            _mmRightFrame:SetMouseMotionEnabled(false)
        else
            _mmRightFrame:EnableMouse(true)
        end
        _mmRightFrame:Show()
    else
        if _mmRightFrame then
            if _mmRightFrame.SetMouseClickEnabled then
                _mmRightFrame:SetMouseClickEnabled(false)
            else
                _mmRightFrame:EnableMouse(false)
            end
            _mmRightFrame:Hide()
        end
    end
end
_G.EllesmereUIKorMinimap_ApplyMicroScale = _MM_ApplyScale
_G.EllesmereUIKorMinimap_ApplyRightClick = _MM_RightClick_Apply

-- ────────── 진입점 ──────────
local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_LOGIN")
f:RegisterEvent("PLAYER_ENTERING_WORLD")
f:SetScript("OnEvent", function(_, event)
    if event == "PLAYER_LOGIN" then
        MigrateFromAdditions()
        if _G.Minimap and _G.Minimap.SetSize then
            pcall(InstallHook)
        end
    end
    pcall(Apply)
    pcall(_MM_ApplyScale)
    pcall(_MM_RightClick_Apply)
    -- 버튼 부착 폴링 (EUI 메인 프레임 lazy)
    if C_Timer and C_Timer.NewTicker then
        local count = 0
        local ticker
        ticker = C_Timer.NewTicker(0.5, function()
            count = count + 1
            TryInstallButton()
            -- OnShow 후크가 걸리면(메인 프레임 등장) 이후엔 그 후크가 버튼을 보장하므로 폴링 종료.
            if _showHooked or count > 600 then
                if ticker then ticker:Cancel() end
            end
        end)
    end
end)
