package encrypt

import (
	"crypto/aes"
	"crypto/cipher"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"server/internal/model"
)

// 内部常量，外部无法访问
const (
	aesKey = "K8mN2pQ9rS5vX1zA" // 16字节密钥
	aesIV  = "H7jL4oP8qR6uW0yZ" // 16字节初始化向量
)

// DecryptAdsData 解密广告数据并反序列化
func DecryptAdsData(encryptedData string) (*model.AdsData, error) {
	// 解码base64数据
	ciphertext, err := base64.StdEncoding.DecodeString(encryptedData)
	if err != nil {
		return nil, fmt.Errorf("base64 decode failed: %v", err)
	}

	// 创建AES cipher
	block, err := aes.NewCipher([]byte(aesKey))
	if err != nil {
		return nil, fmt.Errorf("aes new cipher failed: %v", err)
	}

	// 检查数据长度
	if len(ciphertext) < aes.BlockSize {
		return nil, fmt.Errorf("ciphertext too short")
	}

	// 创建CBC模式
	mode := cipher.NewCBCDecrypter(block, []byte(aesIV))

	// 解密
	plaintext := make([]byte, len(ciphertext))
	mode.CryptBlocks(plaintext, ciphertext)

	// 去除PKCS7填充
	plaintext, err = pkcs7Unpad(plaintext)
	if err != nil {
		return nil, fmt.Errorf("pkcs7 unpad failed: %v", err)
	}

	// 反序列化JSON
	var adsData model.AdsData
	err = json.Unmarshal(plaintext, &adsData)
	if err != nil {
		return nil, fmt.Errorf("json unmarshal failed: %v", err)
	}

	return &adsData, nil
}

// pkcs7Unpad 去除PKCS7填充
func pkcs7Unpad(data []byte) ([]byte, error) {
	length := len(data)
	if length == 0 {
		return nil, fmt.Errorf("invalid padding")
	}

	padding := int(data[length-1])
	if padding > length {
		return nil, fmt.Errorf("invalid padding")
	}

	// 验证填充
	for i := length - padding; i < length; i++ {
		if data[i] != byte(padding) {
			return nil, fmt.Errorf("invalid padding")
		}
	}

	return data[:length-padding], nil
}
