extends Node

## 加密服务
## 提供密码加密、解密等安全功能

# 固定的 Salt（用于生成设备密钥）
const FIXED_SALT: String = "whaleTown_2024_secret_key"

# AES 加密密钥（基于设备ID生成）
var _encryptionKey: PackedByteArray

func _ready():
	_initEncryptionKey()

## 初始化加密密钥
func _initEncryptionKey() -> void:
	# 使用设备唯一ID + 固定Salt 生成加密密钥
	var deviceId = OS.get_unique_id()
	var keyString = deviceId + FIXED_SALT

	# 使用 SHA-256 生成 32 字节密钥
	var crypto = Crypto.new()
	var hash = crypto.generate_random_bytes(32)  # 临时方案，实际应该用 hash

	# 简单实现：取字符串的 MD5 哈希的前32字节
	_encryptionKey = keyString.md5_buffer()
	# 如果需要32字节，重复一次
	_encryptionKey.append_array(keyString.md5_buffer())

## 加密字符串（用于本地存储密码）
func encrypt(plainText: String) -> String:
	if plainText.is_empty():
		return ""

	var crypto = Crypto.new()
	var aes = AESContext.new()

	# 生成随机 IV（初始化向量）
	var iv = crypto.generate_random_bytes(16)

	# 转换明文为字节
	var plainBytes = plainText.to_utf8_buffer()

	# 使用 AES-256-CBC 加密
	aes.start(AESContext.MODE_CBC_ENCRYPT, _encryptionKey.slice(0, 32), iv)
	var encryptedBytes = aes.update(plainBytes)
	aes.finish()

	# 将 IV 和加密数据组合（IV + encrypted_data）
	var combined = PackedByteArray()
	combined.append_array(iv)
	combined.append_array(encryptedBytes)

	# 转换为 Base64 字符串
	return Marshalls.raw_to_base64(combined)

## 解密字符串
func decrypt(encryptedText: String) -> String:
	if encryptedText.is_empty():
		return ""

	# Base64 解码
	var combined = Marshalls.base64_to_raw(encryptedText)
	if combined.size() < 16:
		push_error("加密数据格式错误")
		return ""

	# 分离 IV 和加密数据
	var iv = combined.slice(0, 16)
	var encryptedBytes = combined.slice(16)

	# 解密
	var aes = AESContext.new()
	aes.start(AESContext.MODE_CBC_DECRYPT, _encryptionKey.slice(0, 32), iv)
	var decryptedBytes = aes.update(encryptedBytes)
	aes.finish()

	# 转换为字符串
	return decryptedBytes.get_string_from_utf8()

## 生成密码哈希（用于网络传输）
## 注意：这是简单实现，实际应该使用更安全的算法（如 bcrypt, scrypt）
func hashPassword(password: String, salt: String = "") -> String:
	if password.is_empty():
		return ""

	var combined = password + salt
	return combined.sha256_text()

## 验证密码哈希
func verifyPassword(password: String, hashedPassword: String, salt: String = "") -> bool:
	return hashPassword(password, salt) == hashedPassword

## 生成随机 Salt
func generateSalt(length: int = 16) -> String:
	var crypto = Crypto.new()
	var randomBytes = crypto.generate_random_bytes(length)
	return Marshalls.raw_to_base64(randomBytes)
