#ifndef __RGB_PLAYER_MGR_EFFECT_H__
#define __RGB_PLAYER_MGR_EFFECT_H__

#include "rtthread.h"
#include "stdbool.h"


/**
 * @brief 固定灯效消息结构体    
 *
 * 该结构体用于描述固定灯效的相关参数，包括LED数量和颜色序列。
 * 通过该结构体可以灵活配置不同固定灯效的表现。
 */
typedef struct {
    const char *name;               /**< 固定灯效名称 */
    uint16_t led_count;             /**< LED数量 */
    uint16_t frame_interval_ms;     /**< 帧间隔时间（毫秒） */
    uint16_t frame_count;           /**< 帧数量 */
    const uint32_t *frames;         /**< 颜色数组指针，每个元素表示一个RGB颜色值（如0xRRGGBB） */
    uint16_t frame_stride;          /**< 帧步长（元素个数） */
} rgb_effect_t;


/**
 * @brief 根据名称查找灯效
 * 
 * @param eff 灯效数组
 * @param count 灯效数量
 * @param name 灯效名称
 * @return const rgb_effect_t* 找到的灯效指针，未找到则返回RT_NULL
 */
const rgb_effect_t *rgb_effect_find_by_name(const rgb_effect_t *eff, uint16_t count, const char *name);

/**
 * @brief 获取灯效指定帧的颜色数据
 * 
 * @param effect 灯效参数
 * @param frame_index 帧索引
 * @return const uint32_t* 帧颜色数据指针，未找到则返回RT_NULL
 */
const uint32_t *rgb_effect_get_frame(const rgb_effect_t *eff, uint16_t frame_index);

/**
 * @brief 切换到下一个或上一个灯效
 * 
 * @param eff 灯效数组
 * @param count 灯效数量
 * @param cur 当前灯效指针
 * @param forward 是否切换到下一个，true为下一个，false为上一个
 * @return const rgb_effect_t* 切换后的灯效指针，未找到则返回RT_NULL
 */ 
const rgb_effect_t *rgb_effect_switch(const rgb_effect_t *eff, uint16_t count, const rgb_effect_t *cur, bool forward);

/**
 * @brief 切换到下一个灯效
 * 
 * @param eff 灯效数组
 * @param count 灯效数量
 * @param cur 当前灯效指针
 * @return const rgb_effect_t* 切换后的灯效指针，未找到则返回RT_NULL
 */
const rgb_effect_t *rgb_effect_next(const rgb_effect_t *eff, uint16_t count, const rgb_effect_t *cur);

/**
 * @brief 切换到上一个灯效
 * 
 * @param eff 灯效数组
 * @param count 灯效数量
 * @param cur 当前灯效指针
 * @return const rgb_effect_t* 切换后的灯效指针，未找到则返回RT_NULL
 */
const rgb_effect_t *rgb_effect_prev(const rgb_effect_t *eff, uint16_t count, const rgb_effect_t *cur);

#endif


