#ifndef __BTN_MGR_H__
#define __BTN_MGR_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "rtthread.h"
#include "stdint.h"
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <string.h>

#include "drv_touch.h"

#include "mem_section.h"


#define BUTTON_MGR_THREAD_STACK_SIZE     (1 * 1024)          /**< 按钮管理器线程栈大小 */
#define BUTTON_MGR_THREAD_PRIORITY       (20)                /**< 按钮管理器线程优先级 */
#define BUTTON_MGR_THREAD_TIMESLICE      (10)                /**< 按钮管理器线程时间片大小 */

/* 通过坐标判断点是否位于圆形区域内 */
#define TOUCH_BTN_IN_AREA(px, py, circle) \
    (((px) - (circle).x) * ((px) - (circle).x) + \
     ((py) - (circle).y) * ((py) - (circle).y) <= (circle).r * (circle).r)


// Button event types
typedef enum {
	BTN_PRESS_DOWN = 0,     // button pressed down
	BTN_PRESS_UP,           // button released
	BTN_PRESS_REPEAT,       // repeated press detected
	BTN_SINGLE_CLICK,       // single click completed
	BTN_DOUBLE_CLICK,       // double click completed
	BTN_LONG_PRESS_START,   // long press started
	BTN_LONG_PRESS_HOLD,    // long press holding
	BTN_EVENT_COUNT,        // total number of events
	BTN_NONE_PRESS          // no event
} touch_btn_event_e;

// Button state machine states
typedef enum {
	BTN_STATE_IDLE = 0,     // idle state
	BTN_STATE_PRESS,        // pressed state
	BTN_STATE_RELEASE,      // released state waiting for timeout
	BTN_STATE_REPEAT,       // repeat press state
	BTN_STATE_LONG_HOLD     // long press hold state
} touch_btn_state_e;


/**
 * @brief 触摸区域结构体
 * 用于描述一个触摸区域及其关联的回调函数和状态
 */
typedef struct {
    uint8_t  x;                /**< 圆心 x 坐标 */
    uint8_t  y;                /**< 圆心 y 坐标 */
    uint8_t  r;                /**< 半径 */
} touch_btn_area_t;

/**
 * @brief 触摸按钮参数结构体
 * 用于描述一个触摸按钮的属性和回调函数
*/  
typedef struct {
    uint8_t id;                 /**< 按钮 ID */
    uint32_t press_time;        /**< 记录按下时间 */
    touch_btn_state_e state;    /**< 按钮状态 */
    touch_btn_area_t area;      /**< 触摸区域 */
    void (*short_press)(void);  /**< 短按回调函数 */
    void (*long_press)(void);   /**< 长按回调函数 */
} touch_btn_params_t;

/**
 * @brief 触摸按钮节点结构体
 * 用于管理触摸按钮的状态、事件和回调函数
*/  
typedef struct {
    rt_slist_t node;
    touch_btn_params_t params;
} touch_btn_node_t;

/*
 * @brief: 按钮管理器结构体
 * 用于管理触摸按钮的状态、事件和回调函数
*/
typedef struct {
    bool is_initlized;              /**< 是否初始化 */
    rt_slist_t btn_list;            /**< 按钮链表 */
    rt_device_t touch_device;       /**< 触摸设备 */
    struct rt_semaphore sema;       /**< 信号量 */
    struct rt_thread thread;        /**< 线程 */
    rt_timer_t timer;               /**< 定时器 */
} button_manager_t;

/*
 * @brief: 初始化按钮管理器
 * @return: RT_EOK 成功，-RT_ERROR 失败 
*/
rt_err_t button_mgr_init(void);



/**
 * @brief 按钮管理器短按播放下一首
 * @param button_mgr 按钮管理器实例指针
 * @param args 额外参数（未使用）
*/  
static void button_mgr_short_press_play_next(void *args);

/**
 * @brief 按钮管理器长按音量增加
 * @param button_mgr 按钮管理器实例指针
 * @param args 额外参数（未使用）
*/  
static void button_mgr_long_press_volume_up(void *args);

/**
 * @brief 按钮管理器短按播放上一首
 * @param button_mgr 按钮管理器实例指针
 * @param args 额外参数（未使用）
*/  
static void button_mgr_short_press_play_prev(void *args);

/**
 * @brief 按钮管理器长按音量减少
 * @param button_mgr 按钮管理器实例指针
 * @param args 额外参数（未使用）
*/  
static void button_mgr_long_press_volume_down(void *args);

/**
 * @brief 按钮管理器短按切换RGB颜色
 * @param button_mgr 按钮管理器实例指针
 * @param args 额外参数（未使用）
*/  
static void button_mgr_short_press_rgb_change(void *args);

/**
 * @brief 按钮管理器长按RGB开关
 * @param button_mgr 按钮管理器实例指针
 * @param args 额外参数（未使用）
*/  
static void button_mgr_long_press_rgb_on_off(void *args);

/**
 * @brief 按钮管理器短按切换LED颜色
 * @param button_mgr 按钮管理器实例指针
 * @param args 额外参数（未使用）
*/  
static void button_mgr_short_press_led_change(void *args);

/**
 * @brief 按钮管理器长按LED开关
 * @param button_mgr 按钮管理器实例指针
 * @param args 额外参数（未使用）
*/  
static void button_mgr_long_press_led_on_off(void *args);

/**
 * @brief 按钮管理器短按播放/暂停
 * @param button_mgr 按钮管理器实例指针
 * @param args 额外参数（未使用）
*/  
static void button_mgr_short_press_play_pause(void *args);

/*
 * @brief 按钮管理器长按进入休眠状态
 * @param button_mgr 按钮管理器实例指针
 * @param args 额外参数（未使用）
*/
static void button_mgr_long_press_entry_hibernate(void *args);



#ifdef __cplusplus
}
#endif

#endif  /* __BTN_MGR_H__ */



