#pragma once

#include <core/event/event_bus_macros.h>
#include <types/base/types.h>
#include <platform/input.h>

namespace extra2d::events {

/**
 * @brief 引擎事件总线
 */
DECLARE_EVENT_BUS(Engine)

// ============================================================================
// 应用生命周期事件
// ============================================================================

/**
 * @brief 应用初始化完成事件
 */
DECLARE_EVENT_0(OnInit, Engine)

/**
 * @brief 应用关闭事件
 */
DECLARE_EVENT_0(OnShutdown, Engine)

/**
 * @brief 应用暂停事件
 */
DECLARE_EVENT_0(OnPause, Engine)

/**
 * @brief 应用恢复事件
 */
DECLARE_EVENT_0(OnResume, Engine)

/**
 * @brief 帧更新事件
 * @param dt 帧间隔时间
 */
DECLARE_EVENT_1(OnUpdate, Engine, float)

/**
 * @brief 帧更新后事件
 * @param dt 帧间隔时间
 */
DECLARE_EVENT_1(OnLateUpdate, Engine, float)

/**
 * @brief 固定更新事件
 * @param dt 固定时间步长
 */
DECLARE_EVENT_1(OnFixedUpdate, Engine, float)

// ============================================================================
// 窗口事件
// ============================================================================

/**
 * @brief 窗口大小改变事件
 * @param width 新宽度
 * @param height 新高度
 */
DECLARE_EVENT_2(OnResize, Engine, int32, int32)

/**
 * @brief 窗口关闭事件
 */
DECLARE_EVENT_0(OnClose, Engine)

/**
 * @brief 窗口获得焦点事件
 */
DECLARE_EVENT_0(OnFocus, Engine)

/**
 * @brief 窗口失去焦点事件
 */
DECLARE_EVENT_0(OnBlur, Engine)

/**
 * @brief 窗口显示事件
 */
DECLARE_EVENT_0(OnShow, Engine)

/**
 * @brief 窗口隐藏事件
 */
DECLARE_EVENT_0(OnHide, Engine)

// ============================================================================
// 输入事件
// ============================================================================

/**
 * @brief 键盘按下事件
 * @param key 按键码
 */
DECLARE_EVENT_1(OnKeyDown, Engine, int32)

/**
 * @brief 键盘释放事件
 * @param key 按键码
 */
DECLARE_EVENT_1(OnKeyUp, Engine, int32)

/**
 * @brief 鼠标按下事件
 * @param button 鼠标按键
 * @param x X 坐标
 * @param y Y 坐标
 */
DECLARE_EVENT_3(OnMouseDown, Engine, int32, int32, int32)

/**
 * @brief 鼠标释放事件
 * @param button 鼠标按键
 * @param x X 坐标
 * @param y Y 坐标
 */
DECLARE_EVENT_3(OnMouseUp, Engine, int32, int32, int32)

/**
 * @brief 鼠标移动事件
 * @param x X 坐标
 * @param y Y 坐标
 */
DECLARE_EVENT_2(OnMouseMove, Engine, int32, int32)

/**
 * @brief 鼠标滚轮事件
 * @param delta 滚轮增量
 */
DECLARE_EVENT_1(OnMouseWheel, Engine, int32)

/**
 * @brief 触摸开始事件
 * @param touch 触摸点信息
 */
DECLARE_EVENT_1(OnTouchBegan, Engine, const TouchPoint&)

/**
 * @brief 触摸移动事件
 * @param touch 触摸点信息
 */
DECLARE_EVENT_1(OnTouchMoved, Engine, const TouchPoint&)

/**
 * @brief 触摸结束事件
 * @param touch 触摸点信息
 */
DECLARE_EVENT_1(OnTouchEnded, Engine, const TouchPoint&)

/**
 * @brief 触摸取消事件
 * @param touch 触摸点信息
 */
DECLARE_EVENT_1(OnTouchCancelled, Engine, const TouchPoint&)

// ============================================================================
// 场景事件
// ============================================================================

/**
 * @brief 场景加载完成事件
 */
DECLARE_EVENT_0(OnSceneLoad, Engine)

/**
 * @brief 场景卸载事件
 */
DECLARE_EVENT_0(OnSceneUnload, Engine)

// ============================================================================
// 系统事件
// ============================================================================

/**
 * @brief 低内存警告事件
 */
DECLARE_EVENT_0(OnLowMemory, Engine)

/**
 * @brief 进入后台事件
 */
DECLARE_EVENT_0(OnEnterBackground, Engine)

/**
 * @brief 进入前台事件
 */
DECLARE_EVENT_0(OnEnterForeground, Engine)

} // namespace extra2d::events
