#ifndef __RGB_PLAYER_MGR_PLAYER_H__
#define __RGB_PLAYER_MGR_PLAYER_H__

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

#include "rgb_effect.h"


/**
 * @brief 播放器状态枚举
 */ 
typedef enum {
    RGB_PLAYER_STATE_STOPPED = 0,       /**< 停止状态 */
    RGB_PLAYER_STATE_PLAYING,           /**< 播放状态 */
    RGB_PLAYER_STATE_PAUSED,            /**< 暂停状态 */
} rgb_player_state_e;

/**
 * @brief 播放器事件枚举
 */
typedef enum {
    RGB_PLAYER_EVENT_PLAY = 0,          /**< 播放 */
    RGB_PLAYER_EVENT_PAUSE,             /**< 暂停 */
    RGB_PLAYER_EVENT_STOP,              /**< 停止 */
    RGB_PLAYER_EVENT_SET_FORE_EFFECT,   /**< 设置前灯效 */
    RGB_PLAYER_EVENT_SET_BACK_EFFECT,   /**< 设置后灯效 */
    RGB_PLAYER_EVENT_NEXT_EFFECT,       /**< 下一个灯效 */
    RGB_PLAYER_EVENT_PREV_EFFECT,       /**< 上一个灯效 */
    RGB_PLAYER_EVENT_SET_LOOP,          /**< 设置循环播放 */
    RGB_PLAYER_EVENT_AUDIO_RHYTHM,      /**< 音频律动 */
    RGB_PLAYER_EVENT_SET_FIXED_COLORS,  /**< 设置固定颜色 */
    RGB_PLAYER_EVENT_EXIT,              /**< 退出 */
} rgb_player_event_e;

/**
 * @brief 输出回调函数类型
 * 
 * @param buff 颜色数组指针，每个元素表示一个RGB颜色值（如0xRRGGBB）
 * @param count 颜色数组元素数量
 * @return rt_err_t 错误码
 */ 
typedef rt_err_t (*rgb_player_output_cb_t)(uint32_t *buff, uint32_t count);

/**
 * @brief 播放器消息结构体
 */ 
typedef struct {
    rgb_player_event_e event;           /**< 事件类型 */
    union {
        struct {
            const char *effect_name;            /**< 灯效名称 */
            uint16_t frame_index;               /**< 帧索引 */
            bool is_loop;                       /**< 是否循环播放 */   
        };
        struct {
            uint16_t led_count;             /**< LED数量 */
            const uint32_t *frames;             /**< 颜色数组指针，每个元素表示一个RGB颜色值（如0xRRGGBB） */
        };
    }; 
} rgb_player_msg_t;


/**
 * @brief 播放器配置结构体
 */
typedef struct {
    const rgb_effect_t *effects;        /**< 灯效列表 */
    uint16_t effect_count;              /**< 灯效数量 */

    const rgb_effect_t *fore_effect;    /**< 前景灯效 */
    const rgb_effect_t *back_effect;    /**< 背景灯效 */

    uint32_t *frame_cache;              /**< 帧缓存 */
    uint16_t frame_cache_size;          /**< 帧缓存大小 */

    rgb_player_output_cb_t output_cb;   /**< 输出回调函数 */
    rt_mutex_t output_lock;             /**< 输出锁 */

    const char *sem_name;               /**< 信号量名称 */

    const char *mq_name;                /**< 消息队列名称 */    
    uint8_t *mq_pool;                   /**< 消息队列池 */
    uint16_t mq_pool_size;              /**< 消息队列池大小 */
    
    const char *thread_name;            /**< 线程名称 */
    uint32_t *stack;                    /**< 线程栈 */
    uint32_t stack_size;                /**< 线程栈大小 */
    uint8_t priority;                   /**< 线程优先级 */
    uint32_t timeslice;                 /**< 线程时间片 */
} rgb_player_cfg_t;



/**
 * @brief 播放器结构体
 */
typedef struct {
    bool is_inited;                     /**< 是否初始化 */
    bool has_sem;                       /**< 是否有信号量 */
    volatile bool exit_thread;          /**< 是否退出线程 */

    rgb_player_state_e state;           /**< 播放器状态 */

    const rgb_effect_t *effects;        /**< 灯效列表 */
    uint16_t effect_count;              /**< 灯效数量 */

    const rgb_effect_t *fore_effect;    /**< 前灯效 */
    const rgb_effect_t *back_effect;    /**< 后灯效 */

    uint16_t frame_index;               /**< 当前帧索引 */
    bool is_loop;                       /**< 是否循环播放 */
    uint32_t *frame_cache;              /**< 帧缓存 */
    uint16_t frame_cache_size;          /**< 帧缓存大小 */
    rgb_player_output_cb_t output_cb;   /**< 输出回调函数 */

    rt_mutex_t output_lock;             /**< 输出锁 */
    struct rt_semaphore sem;            /**< 信号量 */
    struct rt_messagequeue mq;          /**< 消息队列 */
    struct rt_thread thread;            /**< 线程 */
} rgb_player_t;

/**
 * @brief 打开播放器
 * 
 * @param player 播放器实例
 * @param cfg 播放器配置
 * @return rt_err_t 错误码
 */
rt_err_t rgb_player_open(rgb_player_t *player, const rgb_player_cfg_t *cfg);

/**
 * @brief 关闭播放器
 * 
 * @param player 播放器实例
 * @return rt_err_t 错误码
 */
rt_err_t rgb_player_close(rgb_player_t *player);

/**
 * @brief 发送播放器消息
 * 
 * @param player 播放器实例
 * @param msg 播放器消息
 * @return rt_err_t 错误码
 */
rt_err_t rgb_player_send(rgb_player_t *player, const rgb_player_msg_t *msg);

/**
 * @brief 获取播放器状态
 * 
 * @param player 播放器实例
 * @return rgb_player_state_e 播放器状态
 */ 
rgb_player_state_e rgb_player_get_state(const rgb_player_t *player);


#endif


