import { CryptoJS } from '@ohos/crypto-js'
import { buffer, util } from '@kit.ArkTS';

/**
 * DES 加密工具类（ArkTS 版本）
 */
class JiaMi {
  /**
     * 使用 key 对 data 进行 DES 加密，并返回 Base64 编码字符串
     * @param data 待加密的字符串（UTF-8）
     * @param id 用户ID
     * @param secret 密钥
     * @returns Base64 编码的加密字符串，失败返回 null
     */
    desCrypto(data: string, id: string, secret: string): string | null {
      const key = `${id}:${secret}`;
      return this.desCryptoWithKey(data, key);
    }

    /**
     * 使用指定 key 对 data 进行 DES 加密
     * @param data 待加密的字符串
     * @param key 密钥字符串
     * @returns Base64 编码的加密字符串，失败返回 null
     */
    desCryptoWithKey(data: string, key: string) {
      const keyHex = CryptoJS.enc.Utf8.parse(key);
      const encrypted = CryptoJS.DES.encrypt(data, keyHex, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
      });
      return encrypted.toString(); // 默认就是 Base64



      let new_key = CryptoJS.enc.Utf8.parse(key);
      // let iv:CryptoJS.lib.WordArray = CryptoJS.lib.WordArray.create(uintArray)
      let encryptd = CryptoJS.DES.encrypt(data, new_key, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7,
        // iv:iv
      })

      let words = encryptd.ciphertext;
      let sigBytes = words.sigBytes;
      let uint8Array = new Uint8Array(sigBytes);

      for (let i = 0; i < sigBytes; i++) {
        uint8Array[i] = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
      }

      return new util.Base64Helper().encodeToStringSync(uint8Array)
      // let jiMw = new util.Base64Helper().decodeSync(jiemiDa)
      return encryptd.toString();
    }

    /**
     * DES 解密（Base64 输入，返回字符串）
     * @param encryptData Base64 编码的密文    03962723612
     * @param key 密钥
     * @returns 明文字符串
     * @throws 错误信息
     */
    decrypt(encryptData: string, key: string): string {
      let new_key = CryptoJS.enc.Utf8.parse(key);
      let uintArray = new Uint8Array([1,2,3,4,5,6,7,8])
      let iv:CryptoJS.lib.WordArray = CryptoJS.lib.WordArray.create(uintArray)
      let bytes = CryptoJS.DES.decrypt(encryptData, new_key, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7,
        // iv:iv
      })
      let result = bytes.toString(CryptoJS.enc.Utf8);
      return result.toString();
    }

    /**
     * 使用 id 和 secret 解密
     * @param encryptData Base64 密文
     * @param id 用户ID
     * @param secret 密钥
     * @returns 明文字符串
     * @throws 错误信息
     */
    decryptWithId(encryptData: string, id: string, secret: string): string {
      const key = `${id}:${secret}`;
      return this.decrypt(encryptData, key);
    }

    /**
     * 辅助函数：将密钥补全或截断为 8 字节（DES 要求）
     * @param key 原始密钥字符串
     * @returns 8 字节长度的字符串
     */
    private static padKeyTo8Bytes(key: string): string {
      let keyStr = key;
      if (keyStr.length < 8) {
        // 不足8字节，补空格（或可改为补0或其他）
        keyStr = keyStr.padEnd(8, ' ');
      } else if (keyStr.length > 8) {
        // 超过8字节，截断
        keyStr = keyStr.substring(0, 8);
      }
      return keyStr;
  }
}

export default JiaMi;