--[[
@module LeftAttrOBJ
@brief  左侧属性面板模块
@desc   负责显示玩家的攻速、切割、暴率、倍攻、复活状态等属性信息
        支持面板的显示/隐藏切换,实时更新属性数据
]]
LeftAttrOBJ = {}
LeftAttrOBJ.__cname = "LeftAttrOBJ"
-- 加载复活装备配置文件
LeftAttrOBJ.config = ssrRequireCsvCfg("cfg_FuHuoZhuangBei")
-- 定时器ID
LeftAttrOBJ.scheduleID = nil
-- 根据平台设置面板位置
if ssrConstCfg.isPc then
    -- PC端位置配置
    LeftAttrOBJ.left_position_hide = { x = -200, y = -36 }  -- 隐藏位置
    LeftAttrOBJ.left_position_show = { x = 0, y = -36 }     -- 显示位置
else
    -- 移动端位置配置
    LeftAttrOBJ.left_position_hide = { x = -200, y = -96 }  -- 隐藏位置
    LeftAttrOBJ.left_position_show = { x = 0, y = -96 }     -- 显示位置
end
-------------------------------↓↓↓ UI操作 ↓↓↓---------------------------------------
--[[
@function main
@brief   主函数(当前为空实现)
@return  void
]]
function LeftAttrOBJ:main()
end
--[[
@function HideandShow
@brief   控制面板显示/隐藏的动画效果
@param   bool  是否播放按钮旋转动画
@return  void
@desc    根据当前显示状态切换面板位置,支持平滑动画过渡
]]
function LeftAttrOBJ:HideandShow(bool)
    -- 面板移动动画函数
    local function visible()
        if self.IsShow then
            -- 隐藏面板:移动到隐藏位置
            GUI:Timeline_EaseSineIn_MoveTo(self.ui.ImageView, self.left_position_hide, 0.1)
        else
            -- 显示面板:移动到显示位置
            GUI:Timeline_EaseSineIn_MoveTo(self.ui.ImageView, self.left_position_show, 0.1)
        end
    end
    
    if bool then
        -- 播放按钮旋转动画
        if self.IsShow then
            -- 隐藏时:按钮旋转180度
            GUI:Timeline_RotateTo(self.ui.HideButton, 180, 0.1, visible)
        else
            -- 显示时:按钮旋转回0度
            GUI:Timeline_RotateTo(self.ui.HideButton, 0, 0.1, visible)
        end
    else
        -- 直接执行移动动画,不旋转按钮
        visible()
    end
end
--[[
@function createLeftPanel
@brief   创建左侧属性面板UI
@return  void
@desc    创建包含攻速、切割、暴率、倍攻、复活状态、战斗状态等信息的面板
]]
local function createLeftPanel()
    -- 获取父容器(窗口ID为105)
    local parent = GUI:Win_FindParent(105)
    if parent then
        -- 清空父容器中的所有子控件
        GUI:removeAllChildren(parent)
        
        -- 创建根节点
        local node = GUI:Node_Create(parent, "Node", 0.00, 0.00)
        
        -- 创建背景图片
        local ImageView = GUI:Image_Create(node, "ImageView", 0.00, LeftAttrOBJ.left_position_show.y, "res/custom/LeftAttr/bg.png")
        
        -- 创建属性文本控件,从上到下依次排列
        local defaultY = 137
        
        -- 攻速文本(青色)
        GUI:Text_Create(ImageView, "gongSu", 70, defaultY, 15, "#21faf2", "")
        defaultY = defaultY - 26
        
        -- 切割文本(青色)
        GUI:Text_Create(ImageView, "qieGe", 70, defaultY, 15, "#21faf2", "")
        defaultY = defaultY - 26
        
        -- 暴率文本(青色)
        GUI:Text_Create(ImageView, "baoLv", 70, defaultY, 15, "#21faf2", "")
        defaultY = defaultY - 26
        
        -- 倍攻文本(青色)
        GUI:Text_Create(ImageView, "beiGong", 70, defaultY, 15, "#21faf2", "")
        defaultY = defaultY - 26
        
        -- 复活状态文本(红色)
        GUI:Text_Create(ImageView, "fuHuo", 70, defaultY, 15, "#FF0000", "")
        defaultY = defaultY - 26
        
        -- 战斗状态文本(绿色,默认显示"脱战状态")
        GUI:Text_Create(ImageView, "zhuangTai", 70, defaultY, 15, "#00FF00", "脱战状态")
        
        -- 创建隐藏/显示按钮
        local HideButtonY = LeftAttrOBJ.left_position_show.y - 14
        local HideButton = GUI:Button_Create(node, "HideButton", 14, HideButtonY, "res/custom/LeftAttr/btn.png")
        GUI:setTouchEnabled(HideButton, true)  -- 启用触摸
        GUI:setAnchorPoint(HideButton, 0.5, 0.5)  -- 设置锚点为中心
        
        -- 创建UI代理对象
        LeftAttrOBJ.ui = GUI:ui_delegate(parent)
        
        -- 注册自定义属性控件(攻速相关,已注释)
        --SL:CustomAttrWidgetAdd("&<REDKEY/U40>&%", LeftAttrOBJ.ui.gongSu)
        
        -- 注册倍攻属性控件
        SL:CustomAttrWidgetAdd("&<REDKEY/T40>&倍", LeftAttrOBJ.ui.beiGong)
        
        -- 添加按钮点击事件
        GUI:addOnClickEvent(LeftAttrOBJ.ui.HideButton, function()
            -- 切换显示状态
            LeftAttrOBJ.IsShow = not LeftAttrOBJ.IsShow
            -- 执行显示/隐藏动画
            LeftAttrOBJ:HideandShow(true)
        end)
    end
end
--[[
@function onBuffUpdate
@brief   Buff状态更新事件处理
@param   t  Buff更新数据表
@return  void
@desc    处理战斗状态和特殊Buff的显示更新
]]
function LeftAttrOBJ:onBuffUpdate(t)
    SL:dump(t, "onBuffUpdate", 3)
    -- 重新初始化UI
    self:reloadInit()
    
    -- 处理战斗状态Buff(ID: 10001)
    if t.buffID == 10001 then
        if t.type == 1 then
            -- 进入战斗状态
            GUI:Text_setString(LeftAttrOBJ.ui.zhuangTai, "战斗状态")
            GUI:Text_setTextColor(LeftAttrOBJ.ui.zhuangTai, "#FF0000")  -- 红色
        end
        if t.type == 0 then
            -- 脱离战斗状态
            GUI:Text_setString(LeftAttrOBJ.ui.zhuangTai, "脱战状态")
            GUI:Text_setTextColor(LeftAttrOBJ.ui.zhuangTai, "#00FF00")  -- 绿色
        end
    end
    -- 处理特殊Buff(ID: 10003)
    if t.buffID == 10003 then
        if t.type == 1 then
            -- 获取玩家对象ID
            local actorID = SL:GetMetaValue("MAIN_ACTOR_ID")
            -- 获取10003号buff信息
            local _buff = SL:GetMetaValue("ACTOR_BUFF_DATA_BY_ID", actorID, 10003)
            -- 获取该buff剩余时间
            local endtime = _buff["endTime"]
            self.endtime = endtime
        end
    end
end
--[[
@function onAttrChange
@brief   属性变化事件处理
@return  void
@desc    当玩家属性发生变化时更新显示的数值
]]
function LeftAttrOBJ:onAttrChange()
    -- 重新初始化UI
    self:reloadInit()
    
    -- 获取各项属性值
    local qieGe = SL:GetMetaValue("ATT_BY_TYPE", 200)   -- 切割属性
    local baoLv = SL:GetMetaValue("ATT_BY_TYPE", 204)   -- 暴击率属性
    local gongSu = SL:GetMetaValue("ATT_BY_TYPE", 228)  -- 攻击速度属性
    
    -- 更新UI显示
    GUI:Text_setString(self.ui.qieGe, qieGe)
    GUI:Text_setString(self.ui.baoLv, baoLv .. "%")           -- 暴率显示为百分比
    GUI:Text_setString(self.ui.gongSu, gongSu + 100 .. "%")  -- 攻速基础值+100后显示为百分比
end
--[[
@function UpdateUI
@brief   更新复活状态UI显示
@return  void
@desc    根据复活状态数据更新UI,支持文本状态和倒计时显示
]]
function LeftAttrOBJ:UpdateUI()
    -- 重新初始化UI
    self:reloadInit()
    
    -- 停止该控件下的定时器
    GUI:unSchedule(self.ui.fuHuo)
    
    -- 处理字符串类型的状态(如"未穿戴"、"已穿戴"等)
    if type(self.state[1]) == "string" then
        GUI:Text_setString(self.ui.fuHuo, self.state[1])
        if self.state[1] == "未穿戴" then
            GUI:Text_setTextColor(self.ui.fuHuo, "#FF0000")  -- 红色
        else
            GUI:Text_setTextColor(self.ui.fuHuo, "#00FF00")  -- 绿色
        end
    end
    -- 处理数字类型的状态(倒计时)
    if type(self.state[1]) == "number" then
        local times = self.state[1]
        GUI:Text_setTextColor(self.ui.fuHuo, "#FF0000")  -- 红色
        GUI:Text_setString(self.ui.fuHuo, "倒计时" .. times .. "秒")
        
        -- 倒计时显示函数
        local function showTime()
            GUI:Text_setString(self.ui.fuHuo, "倒计时" .. times .. "秒")
            times = times - 1
            if times < 0 then
                -- 倒计时结束,停止定时器
                GUI:unSchedule(self.ui.fuHuo)
            end
        end
        
        -- 启动每秒更新的定时器
        GUI:schedule(self.ui.fuHuo, showTime, 1)
    end
end
--[[
@function reloadInit
@brief   重新初始化UI代理
@return  void
@desc    确保UI代理对象存在,用于防止UI对象丢失的情况
]]
function LeftAttrOBJ:reloadInit()
    if not self.ui then
        local parent = GUI:Win_FindParent(105)
        self.ui = GUI:ui_delegate(parent)
    end
end
--[[
@function onEnterGameWorld
@brief   进入游戏世界事件处理
@return  void
@desc    游戏加载完成后优先创建左侧属性面板
]]
local function onEnterGameWorld()
    LeftAttrOBJ.isInit = true
    createLeftPanel()
end
-- 注册进入游戏世界事件
SL:RegisterLUAEvent(LUA_EVENT_ENTER_WORLD, "LeftAttr", onEnterGameWorld)
--[[
@function onBuffUpdate
@brief   Buff更新事件处理函数
@param   t  Buff更新数据
@return  void
]]
local function onBuffUpdate(t)
    LeftAttrOBJ:onBuffUpdate(t)
end
-- 注册主角Buff更新事件
SL:RegisterLUAEvent(LUA_EVENT_MAINBUFFUPDATE, "LeftAttr", onBuffUpdate)
--[[
@function onAttrChange
@brief   属性变化事件处理函数
@return  void
]]
local function onAttrChange()
    LeftAttrOBJ:onAttrChange()
end
-- 注册角色属性变化事件
SL:RegisterLUAEvent(LUA_EVENT_ROLE_PROPERTY_CHANGE, "LeftAttr", onAttrChange)
-------------------------------↓↓↓ 网络消息 ↓↓↓---------------------------------------
--[[
@function SyncResponse
@brief   登录同步消息处理(已注释)
@param   arg1, arg2, arg3  消息参数
@param   data  同步数据
@return  void
@desc    处理服务器同步的数据,当前已被注释掉
]]
--function LeftAttrOBJ:SyncResponse(arg1, arg2, arg3, data)
--    self.data = data
--    if GUI:GetWindow(nil, self.__cname) then
--        --self:UpdateUI()
--    end
--end
--[[
@function FuHuo
@brief   复活状态网络消息处理
@param   arg1, arg2, arg3  消息参数
@param   state  复活状态数据
@return  void
@desc    接收服务器发送的复活状态信息并更新UI显示
]]
function LeftAttrOBJ:FuHuo(arg1, arg2, arg3, state)
    -- 确保UI已初始化
    if not self.ui then
        local parent = GUI:Win_FindParent(105)
        self.ui = GUI:ui_delegate(parent)
    end
    
    -- 保存状态数据
    self.state = state
    -- 更新UI显示
    self:UpdateUI()
end
-- 返回模块对象
return LeftAttrOBJ