------------------------------------
-- AuctionSlotHunter Version: 2.0
-- 在拍卖行列表中显示装备槽位与第三属性
-- Original: Hasicz (https://wago.io/V4_C0sbxw)
-- Updated for WoW 12.0 by 黑灬羊
-- Fixed: 简化解析逻辑，移除 classID 过滤，确保第三属性正常显示
------------------------------------

-- 第三属性 BonusID 映射（12.0 现存：闪避/吸血/加速/永不磨损）
local BonusIDs = {
    ["40"] = ITEM_MOD_CR_AVOIDANCE_SHORT, -- 闪避
    ["41"] = ITEM_MOD_CR_LIFESTEAL_SHORT, -- 吸血
    ["42"] = ITEM_MOD_CR_SPEED_SHORT,     -- 加速
    ["43"] = ITEM_MOD_CR_STURDINESS_SHORT, -- 永不磨损
}

-- 宝石槽 BonusID 集合
local SocketBonusIDs = {
    ["1808"] = true, -- 棱彩宝石槽（通用）
    ["7576"] = true, -- 制造装备植入槽
    ["8809"] = true, -- 地洞钻探者槽
}

-- 颜色常量
local COLOR_SOCKET  = "|cFFFFCC00"  -- 金色：槽位
local COLOR_BONUS   = "|cFF1EFF00"  -- 绿色：第三属性
local COLOR_ILVL    = "|cFF66CCFF"  -- 浅蓝：物品等级
local COLOR_END     = "|r"

local function createFS(row, anchor, xOffset)
    local fs = row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
    local font, size, flags = fs:GetFont()
    fs:SetFont(font, 12, flags)
    if anchor == "RIGHT" then
        fs:SetPoint("RIGHT", row, "RIGHT", xOffset, 0)
    else
        fs:SetPoint("LEFT", row, "LEFT", xOffset, 0)
    end
    fs:Hide()
    fs:SetText("")
    return fs
end

-- 更新行数据的函数 - 使用更可靠的方法获取副属性
local function rowUpdate(row)
    if not (row and row.rowData) then return end
    if not (row.ilvl and row.info) then return end

    local data = row.rowData

    row.ilvl:SetText("")
    row.ilvl:Hide()
    row.info:SetText("")
    row.info:Hide()

    -- 获取 itemLink：
    -- 1. 优先用 rowData.itemLink（Auctionator 等第三方插件已填充）
    -- 2. 原生 AH 的 rowData 仅含 itemKey，通过 API 取第一条结果的 itemLink
    local itemLink = data.itemLink
    if not itemLink and data.itemKey then
        local result = C_AuctionHouse.GetItemSearchResultInfo(data.itemKey, 1)
        if result then itemLink = result.itemLink end
    end
    if not itemLink then return end

    -- 物品等级（左侧浅蓝，独立显示）
    local ilvl = C_Item.GetDetailedItemLevelInfo(itemLink)
    if ilvl and ilvl > 0 then
        row.ilvl:SetText(COLOR_ILVL .. ilvl .. COLOR_END)
        row.ilvl:Show()
    end

    -- 解析 BonusID 列表（遍历所有冒号分隔的部分）
    local bonusPart = string.match(itemLink, "item:%d+([:%d]*)")
    if not bonusPart then return end

    local hasSocket = false
    local statText = nil
    local itemIds = { strsplit(":", bonusPart) }

    for _, id in pairs(itemIds) do
        if id and id ~= "" then
            if BonusIDs[id] then
                statText = BonusIDs[id]
            end
            if SocketBonusIDs[id] then
                hasSocket = true
            end
        end
    end

    -- 合并槽位与第三属性为一个文本，确保同时显示
    if hasSocket or statText then
        local parts = {}
        if hasSocket then
            table.insert(parts, COLOR_SOCKET .. "【槽】" .. COLOR_END)
        end
        if statText then
            table.insert(parts, COLOR_BONUS .. statText .. COLOR_END)
        end
        row.info:SetText(table.concat(parts, " "))
        row.info:Show()
    end
end

-- 处理所有行的函数
local function processRows()
    -- 检查拍卖行框架和相关组件是否存在
    if AuctionHouseFrame
        and AuctionHouseFrame.ItemBuyFrame
        and AuctionHouseFrame.ItemBuyFrame.ItemList
        and AuctionHouseFrame.ItemBuyFrame.ItemList.tableBuilder
    then
        -- 遍历所有表格行
        for _, row in pairs(AuctionHouseFrame.ItemBuyFrame.ItemList.tableBuilder.rows) do
            if not row.ilvl then
                row.ilvl = createFS(row, "LEFT", 230)
            end
            if not row.info then
                -- 紧贴在 ilvl 右侧，避免遮挡右侧时效列
                local fs = row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
                local font, _, flags = fs:GetFont()
                fs:SetFont(font, 12, flags)
                fs:SetPoint("LEFT", row.ilvl, "RIGHT", 8, 0)
                fs:Hide()
                fs:SetText("")
                row.info = fs
            end
            -- 更新行显示
            rowUpdate(row)
        end
    end
end

-- 定时器变量
local ticker

-- 创建主框架
local frame = CreateFrame("Frame")
-- 注册事件
frame:RegisterEvent("AUCTION_HOUSE_SHOW")                 -- 拍卖行打开
frame:RegisterEvent("AUCTION_HOUSE_BROWSE_RESULTS_ADDED") -- 浏览结果添加
frame:RegisterEvent("AUCTION_HOUSE_CLOSED")               -- 拍卖行关闭
frame:RegisterEvent("AUCTION_HOUSE_BROWSE_RESULTS_UPDATED") -- 浏览结果更新
frame:RegisterEvent("AUCTION_HOUSE_BROWSE_FAILURE")       -- 浏览失败
frame:RegisterEvent("ITEM_SEARCH_RESULTS_UPDATED")        -- 物品搜索更新

-- 设置事件处理脚本
frame:SetScript("OnEvent", function(self, event, ...)
    -- 当物品搜索结果更新时，启动定时器处理行
    if event == "ITEM_SEARCH_RESULTS_UPDATED" then
        if ticker then ticker:Cancel() end  -- 取消之前的定时器
        ticker = C_Timer.NewTicker(0.1, processRows)  -- 每0.1秒处理一次行
    else
        -- 其他事件时取消定时器
        if ticker then ticker:Cancel() end
    end
end)