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

package util

import (
	"bytes"
	"encoding/json"
	"strings"
	"os"

	wm "github.com/linuxdeepin/go-dbus-factory/com.deepin.wm"
)

// 将Go对象序列化为JSON字符串（不转义HTML）
func MarshalJSON(v interface{}) (string, error) {
	var buf bytes.Buffer
	enc := json.NewEncoder(&buf)
	enc.SetEscapeHTML(false) // 禁用HTML转义
	err := enc.Encode(v)     // 编码对象
	if err != nil {
		return "", err
	}
	return buf.String(), nil // 返回JSON字符串
}

// KWin快捷键结构体
type KWinAccel struct {
	Id                string   // 快捷键ID
	Keystrokes        []string `json:"Accels"`          // 当前快捷键组合
	DefaultKeystrokes []string `json:"Default,omitempty"` // 默认快捷键组合
}

// 清理和规范化快捷键数据
func (kwa *KWinAccel) fix() {
	// 清理当前快捷键组合
	var keystrokes []string
	for _, ks := range kwa.Keystrokes {
		if ks == "" {
			continue // 跳过空快捷键
		}
		keystrokes = append(keystrokes, ks)
	}
	kwa.Keystrokes = keystrokes

	// 清理默认快捷键组合
	var defaultKeystrokes []string
	for _, ks := range kwa.DefaultKeystrokes {
		if ks == "" || strings.Contains(ks, " ") {
			continue // 跳过空快捷键或包含空格的快捷键
		}
		defaultKeystrokes = append(defaultKeystrokes, ks)
	}

	kwa.DefaultKeystrokes = defaultKeystrokes
}

// 获取所有KWin快捷键配置
func GetAllKWinAccels(wm wm.Wm) ([]KWinAccel, error) {
	// 从窗口管理器获取所有快捷键的JSON数据
	allJson, err := wm.GetAllAccels(0)
	if err != nil {
		return nil, err
	}
	// 在Wayland会话中修复SysReq快捷键
	sessionType := os.Getenv("XDG_SESSION_TYPE")
	if strings.Contains(sessionType, "wayland") && strings.Contains(allJson, "SysReq") {
		allJson = strings.Replace(allJson, "SysReq", "<Alt>Print", -1) // 替换SysReq为Alt+Print
	}

	// 解析JSON数据
	var result []KWinAccel
	err = json.Unmarshal([]byte(allJson), &result)
	if err != nil {
		return nil, err
	}

	// 清理和规范化每个快捷键数据
	for idx := range result {
		result[idx].fix()
	}

	return result, nil
}
