// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

package shortcuts

// 动作类型枚举
type ActionType uint

// 动作类型常量定义
const (
	ActionTypeNonOp ActionType = iota // 无操作
	ActionTypeExecCmd                 // 执行命令
	ActionTypeOpenMimeType            // 打开MIME类型关联程序
	ActionTypeDesktopFile             // 运行桌面文件
	ActionTypeShowNumLockOSD          // 显示NumLock状态提示
	ActionTypeShowCapsLockOSD         // 显示CapsLock状态提示
	ActionTypeSystemShutdown          // 系统关机
	ActionTypeSystemSuspend           // 系统休眠
	ActionTypeSystemLogOff            // 系统注销
	ActionTypeSystemAway              // 系统离开

	// 控制器类型
	ActionTypeAudioCtrl        // 音频控制器
	ActionTypeMediaPlayerCtrl  // 媒体播放器控制器 (MPRIS)
	ActionTypeDisplayCtrl      // 显示控制器
	ActionTypeKbdLightCtrl     // 键盘背光控制器
	ActionTypeTouchpadCtrl     // 触摸板控制器

	ActionTypeSwitchKbdLayout   // 切换键盘布局

	ActionTypeToggleWireless     // 切换无线状态
	ActionTypeShowControlCenter  // 显示控制中心

	ActionTypeCallback // 回调函数类型动作

	// 结束标记
	actionTypeMax
)

// 动作类型总数
const ActionTypeCount = int(actionTypeMax)

// 动作结构体
type Action struct {
	Type ActionType   // 动作类型
	Arg  interface{} // 动作参数
}

// 无操作动作实例
var ActionNoOp = &Action{Type: ActionTypeNonOp}

// 执行命令动作参数
type ActionExecCmdArg struct {
	ExecOnRelease bool   // 是否在按键释放时执行
	Cmd           string // 要执行的命令
}

// 创建执行命令动作
func NewExecCmdAction(cmd string, execOnRelease bool) *Action {
	return &Action{
		Type: ActionTypeExecCmd,
		Arg: &ActionExecCmdArg{
			ExecOnRelease: execOnRelease, // 设置执行时机
			Cmd:           cmd,           // 设置命令
		},
	}
}

// 创建打开MIME类型关联程序的动作
func NewOpenMimeTypeAction(mimeType string) *Action {
	return &Action{
		Type: ActionTypeOpenMimeType,
		Arg:  mimeType, // 设置MIME类型
	}
}

// 控制器命令类型
type ActionCmd uint

// 控制器命令常量
const (
	// 音频控制命令
	AudioSinkMuteToggle ActionCmd = iota + 1 // 切换扬声器静音
	AudioSinkVolumeUp                       // 扬声器音量增加
	AudioSinkVolumeDown                      // 扬声器音量减少
	AudioSourceMuteToggle                   // 切换麦克风静音

	// 媒体播放控制命令
	MediaPlayerPlay     // 播放
	MediaPlayerPause    // 暂停
	MediaPlayerStop     // 停止
	MediaPlayerPrevious // 上一首
	MediaPlayerNext     // 下一首
	MediaPlayerRewind   // 快退
	MediaPlayerForword  // 快进
	MediaPlayerRepeat   // 重复播放

	// 显示控制命令
	MonitorBrightnessUp    // 增加亮度
	MonitorBrightnessDown  // 降低亮度
	DisplayModeSwitch      // 切换显示模式
	AdjustBrightnessSwitch // 切换亮度调节

	// 键盘背光控制命令
	KbdLightToggle          // 切换背光开关
	KbdLightBrightnessUp   // 增加背光亮度
	KbdLightBrightnessDown // 降低背光亮度

	// 触摸板控制命令
	TouchpadToggle // 切换触摸板开关
	TouchpadOn     // 开启触摸板
	TouchpadOff    // 关闭触摸板
)

// 创建音频控制动作
func NewAudioCtrlAction(cmd ActionCmd) *Action {
	return &Action{
		Type: ActionTypeAudioCtrl,
		Arg:  cmd, // 设置音频控制命令
	}
}

// 创建媒体播放器控制动作
func NewMediaPlayerCtrlAction(cmd ActionCmd) *Action {
	return &Action{
		Type: ActionTypeMediaPlayerCtrl,
		Arg:  cmd, // 设置媒体播放控制命令
	}
}

// 创建显示控制动作
func NewDisplayCtrlAction(cmd ActionCmd) *Action {
	return &Action{
		Type: ActionTypeDisplayCtrl,
		Arg:  cmd, // 设置显示控制命令
	}
}

// 创建键盘背光控制动作
func NewKbdBrightnessCtrlAction(cmd ActionCmd) *Action {
	return &Action{
		Type: ActionTypeKbdLightCtrl,
		Arg:  cmd, // 设置背光控制命令
	}
}

// 创建触摸板控制动作
func NewTouchpadCtrlAction(cmd ActionCmd) *Action {
	return &Action{
		Type: ActionTypeTouchpadCtrl,
		Arg:  cmd, // 设置触摸板控制命令
	}
}

// 创建回调函数动作
func NewCallbackAction(fn func(ev *KeyEvent)) *Action {
	return &Action{
		Type: ActionTypeCallback,
		Arg:  fn, // 设置回调函数
	}
}
