-- MiniCC Bridge for OrzUI
-- 将 OrzUI 基于 oUF 创建的队伍/团队框架注册给 MiniCC，
-- 让 MiniCC 能在 OrzUI 的队友框架上显示 CC / 重要技能图标。
--
-- 实现原理：
--   OrzUI 通过 oUF:SpawnHeader 创建以下全局 header：
--     - oUF_Party                 （小队模式）
--     - oUF_Raid                  （团队简单模式）
--     - oUF_Raid1 ~ oUF_Raid8     （团队分组模式）
--   它们的子 frame 即为单位按钮，带有 .unit 或 GetAttribute("unit")。
--
--   MiniCC 暴露了 MiniCCApi.v1:RegisterFrameProvider 公共接口，
--   只要把这些 header 的子 frame 收集成数组返回即可。

local _, ns = ...
local B = ns and ns[1]

-- 仅在用户同时启用了 MiniCC 时才工作
local function IsMiniCCLoaded()
	return C_AddOns and C_AddOns.IsAddOnLoaded and C_AddOns.IsAddOnLoaded("MiniCC")
end

-- 收集 OrzUI 当前所有可用的 oUF 单位按钮
local function CollectFrames()
	local frames = {}
	local seen = {}

	local function AddHeader(header)
		if not header then return end
		if header.IsForbidden and header:IsForbidden() then return end
		for _, child in ipairs({ header:GetChildren() }) do
			if not seen[child] then
				local unit = child.unit or (child.GetAttribute and child:GetAttribute("unit"))
				if unit and unit ~= "" then
					if not (child.IsForbidden and child:IsForbidden()) then
						seen[child] = true
						frames[#frames + 1] = child
					end
				end
			end
		end
	end

	-- 小队 header
	AddHeader(_G["oUF_Party"])

	-- 团队 header：简单模式下只有 oUF_Raid，分组模式下是 oUF_Raid1..8
	AddHeader(_G["oUF_Raid"])
	for i = 1, 8 do
		AddHeader(_G["oUF_Raid" .. i])
	end

	return frames
end

local refreshCallback ---@type fun()|nil

-- 一段防抖：合并短时间内的多次刷新请求
local refreshScheduled = false
local function ScheduleRefresh()
	if not refreshCallback or refreshScheduled then return end
	refreshScheduled = true
	C_Timer.After(0.1, function()
		refreshScheduled = false
		if refreshCallback then refreshCallback() end
	end)
end

local provider = {
	Name = "OrzUI",
	GetFrames = CollectFrames,
	-- 注意：MiniCC 通过 pcall(provider.RegisterRefreshFrames, callback) 调用此函数，
	-- 第一个参数即为回调，不是 self。
	RegisterRefreshFrames = function(cb)
		refreshCallback = cb
	end,
}

local function TryRegister()
	if not IsMiniCCLoaded() then return false end
	if not MiniCCApi or not MiniCCApi.v1 or not MiniCCApi.v1.RegisterFrameProvider then
		return false
	end

	MiniCCApi.v1:RegisterFrameProvider(provider)
	return true
end

-- 监听必要事件，在合适时机注册并通知 MiniCC 刷新框架列表
local watcher = CreateFrame("Frame")
watcher:RegisterEvent("PLAYER_LOGIN")
watcher:RegisterEvent("PLAYER_ENTERING_WORLD")
watcher:RegisterEvent("GROUP_ROSTER_UPDATE")
watcher:RegisterEvent("ADDON_LOADED")

local registered = false

watcher:SetScript("OnEvent", function(self, event, arg1)
	if event == "ADDON_LOADED" then
		if arg1 == "MiniCC" and not registered then
			registered = TryRegister()
			if registered then ScheduleRefresh() end
		end
		return
	end

	if not registered then
		registered = TryRegister()
	end

	-- header 由 OrzUI 在 PLAYER_LOGIN 阶段创建；
	-- 框架的子按钮可能在 PLAYER_ENTERING_WORLD / GROUP_ROSTER_UPDATE 之后才稳定。
	if registered then
		ScheduleRefresh()
	end
end)
