/*
 * @Author: 15902849627 380091478@qq.com
 * @Date: 2024-06-12 15:37:21
 * @LastEditors: 15902849627 380091478@qq.com
 * @LastEditTime: 2024-06-12 15:59:21
 * @FilePath: \Platform-Web\src\lib\encrypt.js
 * @Description: 
 * 
 * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
 */
import CryptoJS from 'crypto-js';
import CryptoSM from 'sm-crypto';

function object2string(data) {
  if (typeof data === 'Object') {
    return JSON.stringify(data);
  }

  let str = JSON.stringify(data);
  if (str.startsWith("'") || str.startsWith('"')) {
    str = str.substring(1);
  }
  if (str.endsWith("'") || str.endsWith('"')) {
    str = str.substring(0, str.length - 1);
  }
  return str;
}

// -----------------------  AES 加密、解密 -----------------------
const AES_KEY = 'cc81a41aee1a6078b6cbb3950f3e3c38';

const AES = {
  encryptData: function (data) {
    // AES 加密 并转为 base64
    let utf8Data = CryptoJS.enc.Utf8.parse(object2string(data));
    const key = CryptoJS.enc.Utf8.parse(AES_KEY);
    const encrypted = CryptoJS.AES.encrypt(utf8Data, key, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7,
    });

    return encrypted.toString();
  },

  decryptData: function (data) {
    //  第一步：Base64 解码
    let words = CryptoJS.enc.Base64.parse(data);

    // 第二步：AES 解密
    const key = CryptoJS.enc.Utf8.parse(AES_KEY);
    return CryptoJS.AES.decrypt({ ciphertext: words }, key, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7,
    }).toString(CryptoJS.enc.Utf8);
  },
};

// -----------------------  国密SM4算法 加密、解密 -----------------------
const SM4_KEY = 'cc81a41aee1a6078b6cbb3950f3e3c38';

const SM4 = {
  encryptData: function (data) {
    // 第一步：SM4 加密
    let encryptData = CryptoSM.sm4.encrypt(object2string(data), SM4_KEY);
    // 第二步： Base64 编码
    return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(encryptData));
  },

  decryptData: function (data) {
    // 第一步：Base64 解码
    let words = CryptoJS.enc.Base64.parse(data);
    let decode64Str = CryptoJS.enc.Utf8.stringify(words);

    // 第二步：SM4 解密
    return CryptoSM.sm4.decrypt(decode64Str, SM4_KEY);
  },
};

// -----------------------  对外暴露： 加密、解密 -----------------------

// 默认使用SM4算法
const EncryptObject = SM4;
// const EncryptObject = AES;

/**
 * 加密
 */
export const encryptData = function (data) {
  return !data ? null : EncryptObject.encryptData(data);
};

/**
 * 解密
 */
export const decryptData = function (data) {
  return !data ? null : EncryptObject.decryptData(data);
};
