using System;
using UnityEngine;

public class BluetoothDecryptor
{
    // 密钥长度
    private const int KEY_LENGTH = 12;
    // 对称密钥
    private static readonly byte[] c_abySecretKey = System.Text.Encoding.ASCII.GetBytes("qingfengluan");

    /***********************************************************
    *@函 数 名 : AUTHOR_ImprovedDecrypt
    *@功能说明 : 解密函数
    *@形 参 : pbyData - 待解密字符串
    *@ dwDataLen - 解密数据长度
    *@返 回 值 : pbyData - 解密后的数据
    *@作 者 : Shaoxin Wu
    *@日 期 : 2024-06-24
    ***********************************************************/
    public static byte[] AUTHOR_ImprovedDecrypt(byte[] pbyData, uint dwDataLen)
    {
        for (uint i = 0; i < dwDataLen; i++)
        {
            for (int j = KEY_LENGTH - 1; j >= 0; j--)
            {
                pbyData[i] = (byte)((pbyData[i] >> 1) | (pbyData[i] << 7)); // 右循环移位
                pbyData[i] ^= c_abySecretKey[j]; // 多轮异或
            }
        }
        return pbyData;
    }

    /***********************************************************
    *@函 数 名 : CheckSum
    *@功能说明 : 累加和校验计算
    *@形 参 : pbyData - 数据地址
    *@ byDataLen - 校验数据长度
    *@返 回 值 : 校验和结果
    *@作 者 : Shaoxin Wu
    *@日 期 : 2024-06-24
    ***********************************************************/
    public static byte CheckSum(byte[] pbyData, byte byDataLen)
    {
        byte byRet = 0;
        for (byte i = 0; i < byDataLen; i++)
        {
            byRet += pbyData[i];
        }
        return byRet;
    }

    /// <summary>
    /// 最前面插入一个字节
    /// </summary>
    /// <param name="originalArray"></param>
    /// <param name="newByte"></param>
    /// <returns></returns>
    public static byte[] InsertByteAtBeginning(byte[] originalArray, byte newByte)
    {
        byte[] newArray = new byte[originalArray.Length + 1];
        newArray[0] = newByte;
        Array.Copy(originalArray, 0, newArray, 1, originalArray.Length);
        return newArray;
    }

    public static byte[] GetResponse(byte[] bytes) {
        //byte[] dataToDecrypt = { 0x5A, 0x76, 0xD1, 0x02, 0xEB, 0x8E, 0x5D };
        //需要解密的4个数据
        byte[] encryptedData = new byte[] { bytes[1], bytes[2], bytes[3], bytes[4] };
        uint dataLength = (uint)encryptedData.Length;
        byte checksumStart = CheckSum(new byte[] { bytes[0] , bytes[1], bytes[2], bytes[3], bytes[4] }, 5);
        // 打印开始校验和
        //Debug.Log("checksumStart: " + checksumStart + ",对应16进制=" + checksumStart.ToString("X"));

        // 打印原始加密数据
        Debug.Log("Original Data: " + System.BitConverter.ToString(bytes));
        //Debug.Log("Original Encrypted Data: " + System.BitConverter.ToString(encryptedData));
        // 解密数据
        byte[] decryptedData = AUTHOR_ImprovedDecrypt(encryptedData, dataLength);
        // 打印解密后的数据
        //Debug.Log("Decrypted Data: " + System.BitConverter.ToString(decryptedData));
        byte[] newArray = InsertByteAtBeginning(decryptedData, bytes[0]);
        //Debug.Log("前插 {0x5A} 后:  " + System.BitConverter.ToString(newArray));
        // 计算累加和校验
        byte checksum = CheckSum(newArray, (byte)newArray.Length);
       // Debug.Log("checksum:" + checksum + ", 对应16进制："+ checksum.ToString("X"));
        //byte checksum = Decryptor.CheckSum(decryptedData, (byte)dataLength);
        //// 打印校验和
        //Debug.Log("Checksum: " + checksum+",16=" + checksum.ToString("X"));
        // 组装应答数据
        byte[] responseData = new byte[7];
        responseData[0] = 0x5A; // 起始码
        System.Array.Copy(decryptedData, 0, responseData, 1, decryptedData.Length); // 解密数据
        responseData[5] = checksum; // 累加和校验
        responseData[6] = 0x5D; // 结束码
        // 将应答数据转换为字符串
        Debug.Log("Original Response Data: " + System.BitConverter.ToString(responseData));
       // string responseString = System.BitConverter.ToString(responseData).Replace("-", "");
        //Debug.Log("Response Data: " + responseString);
        return responseData;
    }

}
