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

// media_shortcut.go 处理媒体快捷键配置和操作
package shortcuts

import (
	"github.com/godbus/dbus"
)

// MediaShortcut 表示媒体快捷键
// 继承自GSettingsShortcut，用于处理系统媒体按键的配置和操作
type MediaShortcut struct {
	*GSettingsShortcut // 继承GSettingsShortcut
}

// MIME类型常量
// 定义各种文件类型对应的MIME类型，用于打开特定类型的文件
const (
	mimeTypeBrowser    = "x-scheme-handler/http"   // 浏览器MIME类型（HTTP/HTTPS链接）
	mimeTypeMail       = "x-scheme-handler/mailto" // 邮件MIME类型（mailto链接）
	mimeTypeAudioMedia = "audio/mpeg"              // 音频MIME类型（MP3等音频文件）
	mimeTypeVideoMp4   = "video/mp4"               // 视频MIME类型（MP4视频文件）
	mimeTypeDir        = "inode/directory"          // 目录MIME类型（文件夹）
	mimeTypeImagePng   = "image/png"               // 图片MIME类型（PNG图片）
)

// 命令常量
// 定义各种系统操作的命令字符串
const (
	cmdMyComputer = "gio open computer:///"  // 打开"我的电脑"
	cmdDocuments  = "gio open ~/Documents"   // 打开文档目录
	cmdEject      = "eject -r"               // 弹出可移动设备
	cmdCalculator = "deepin-calculator"       // 打开计算器
	cmdCalendar   = "dde-calendar"            // 打开日历
	cmdMeeting    = "deepin-contacts"         // 打开联系人
	cmdTerminal   = "/usr/lib/deepin-daemon/default-terminal" // 打开终端
	cmdMessenger  = "dbus-send --print-reply --dest=com.deepin.dde.osd /com/deepin/dde/Notification com.deepin.dde.Notification.Toggle" // 切换通知中心
	cmdLauncher   = "dbus-send --print-reply --dest=com.deepin.dde.Launcher /com/deepin/dde/Launcher com.deepin.dde.Launcher.Toggle" // 切换启动器
	cmdCamera     = "/usr/share/dde-daemon/keybinding/cameraSwitch.sh" // 切换摄像头
)

// mediaIdActionMap 媒体ID到操作的映射
// 该映射定义了所有支持的媒体快捷键及其对应的操作
var mediaIdActionMap = map[string]*Action{
	"numlock":  &Action{Type: ActionTypeShowNumLockOSD}, // 数字锁定键状态提示
	"capslock": &Action{Type: ActionTypeShowCapsLockOSD}, // 大写锁定键状态提示

	// 打开特定MIME类型
	"home-page":   NewOpenMimeTypeAction(mimeTypeBrowser), // 打开主页（浏览器）
	"www":         NewOpenMimeTypeAction(mimeTypeBrowser), // 打开网页（浏览器）
	"explorer":    NewOpenMimeTypeAction(mimeTypeDir),     // 打开文件管理器（目录）
	"mail":        NewOpenMimeTypeAction(mimeTypeMail),    // 打开邮件客户端
	"audio-media": NewOpenMimeTypeAction(mimeTypeAudioMedia), // 打开音频文件
	"music":       NewOpenMimeTypeAction(mimeTypeAudioMedia), // 打开音乐文件
	"pictures":    NewOpenMimeTypeAction(mimeTypeImagePng), // 打开图片文件
	"video":       NewOpenMimeTypeAction(mimeTypeVideoMp4), // 打开视频文件

	// 执行命令
	"my-computer": NewExecCmdAction(cmdMyComputer, false), // 打开"我的电脑"
	"documents":   NewExecCmdAction(cmdDocuments, false),  // 打开文档目录
	"eject":       NewExecCmdAction(cmdEject, false),       // 弹出可移动设备
	"calculator":  NewExecCmdAction(cmdCalculator, false), // 打开计算器
	"calendar":    NewExecCmdAction(cmdCalendar, false),   // 打开日历
	"meeting":     NewExecCmdAction(cmdMeeting, false),    // 打开联系人
	"terminal":    NewExecCmdAction(cmdTerminal, false),   // 打开终端
	"messenger":   NewExecCmdAction(cmdMessenger, false),  // 切换通知中心
	"app-left":    NewExecCmdAction(cmdLauncher, false),   // 左侧应用键（启动器）
	"app-right":   NewExecCmdAction(cmdLauncher, false),   // 右侧应用键（启动器）

	// 音频控制
	"audio-mute":         NewAudioCtrlAction(AudioSinkMuteToggle), // 静音切换
	"audio-raise-volume": NewAudioCtrlAction(AudioSinkVolumeUp),   // 增加音量
	"audio-lower-volume": NewAudioCtrlAction(AudioSinkVolumeDown), // 降低音量
	"audio-mic-mute":     NewAudioCtrlAction(AudioSourceMuteToggle), // 麦克风静音切换

	// 媒体播放控制
	"audio-play":    NewMediaPlayerCtrlAction(MediaPlayerPlay),     // 播放
	"audio-pause":   NewMediaPlayerCtrlAction(MediaPlayerPause),    // 暂停
	"audio-stop":    NewMediaPlayerCtrlAction(MediaPlayerStop),     // 停止
	"audio-forward": NewMediaPlayerCtrlAction(MediaPlayerForword),  // 快进
	"audio-rewind":  NewMediaPlayerCtrlAction(MediaPlayerRewind),   // 快退
	"audio-prev":    NewMediaPlayerCtrlAction(MediaPlayerPrevious), // 上一首
	"audio-next":    NewMediaPlayerCtrlAction(MediaPlayerNext),     // 下一首
	"audio-repeat":  NewMediaPlayerCtrlAction(MediaPlayerRepeat),   // 重复播放
	// TODO 待实现: audio-random-play audio-cycle-track

	// 显示控制
	"mon-brightness-up":   NewDisplayCtrlAction(MonitorBrightnessUp),   // 增加屏幕亮度
	"mon-brightness-down": NewDisplayCtrlAction(MonitorBrightnessDown), // 降低屏幕亮度
	"display":             NewDisplayCtrlAction(DisplayModeSwitch),      // 显示模式切换（如扩展/复制屏幕）
	"adjust-brightness":   NewDisplayCtrlAction(AdjustBrightnessSwitch), // 亮度调节开关

	// 键盘背光控制
	"kbd-light-on-off":    NewKbdBrightnessCtrlAction(KbdLightToggle),        // 键盘背光开关
	"kbd-brightness-up":   NewKbdBrightnessCtrlAction(KbdLightBrightnessUp),   // 增加键盘背光亮度
	"kbd-brightness-down": NewKbdBrightnessCtrlAction(KbdLightBrightnessDown), // 降低键盘背光亮度

	// 触摸板控制
	"touchpad-toggle": NewTouchpadCtrlAction(TouchpadToggle), // 触摸板开关
	"touchpad-on":     NewTouchpadCtrlAction(TouchpadOn),     // 开启触摸板
	"touchpad-off":    NewTouchpadCtrlAction(TouchpadOff),    // 关闭触摸板

	// 电源管理
	"suspend": &Action{Type: ActionTypeSystemSuspend}, // 系统挂起（睡眠）
	"sleep":   &Action{Type: ActionTypeSystemSuspend}, // 系统睡眠（同挂起）
	"log-off": &Action{Type: ActionTypeSystemLogOff},  // 注销系统
	"away":    &Action{Type: ActionTypeSystemAway},     // 离开模式（节能模式）

	"web-cam": NewExecCmdAction(cmdCamera, false), // 摄像头开关

	// 无线网络控制
	"wlan":  &Action{Type: ActionTypeToggleWireless}, // 无线网络开关
	"tools": &Action{Type: ActionTypeShowControlCenter}, // 显示控制中心
}

// showOSD 在屏幕上显示通知
// signal: 要显示的OSD信号，如"NumLockOn"、"CapsLockOff"等
func showOSD(signal string) {
	logger.Debug("show OSD", signal)
	sessionDBus, _ := dbus.SessionBus()
	go sessionDBus.Object("com.deepin.dde.osd", "/").Call("com.deepin.dde.osd.ShowOSD", 0, signal)
}

// GetAction 获取媒体快捷键对应的操作
// 根据快捷键ID查找对应的操作，如果找不到则返回空操作
func (ms *MediaShortcut) GetAction() *Action {
	logger.Debug("MediaShortcut.GetAction", ms.Id)
	if action, ok := mediaIdActionMap[ms.Id]; ok {
		return action
	}
	return ActionNoOp
}

// GetAction 根据ID获取媒体操作
// 全局函数，根据ID直接查找媒体操作
func GetAction(id string) *Action {
	if action, ok := mediaIdActionMap[id]; ok {
		return action
	}

	return ActionNoOp
}
