/**
 * @author 冷 (https://github.com/LengYXin)
 * @email lengyingxin8966@gmail.com
 * @create date 2021-08-23 11:23:50
 * @modify date 2021-08-23 11:23:50
 * @desc [算法]
 */
import type Bowser from 'bowser';
import CryptoAes from 'crypto-js/aes';
import CryptoBase64 from 'crypto-js/enc-base64';
import CryptoHex from 'crypto-js/enc-hex';
import CryptoUtf8 from 'crypto-js/enc-utf8';
import CryptoCfb from 'crypto-js/mode-cfb';
import CryptoPkcs7 from 'crypto-js/pad-pkcs7';
import dayjs from 'dayjs';
import lodash from 'lodash';
const day = dayjs().format('YYYY-MM-DD');
export class AuthEncryption {
  /** @type AES_Key 秘钥 当前日期 */
  static readonly AES_Config = {
    AES_Key: CryptoUtf8.parse('day'),
    AES_IV: CryptoHex.parse('day'),
    set(
      SystemInfo: {
        /** 微信 版本 */
        version?: string;
        /** 系统信息 */
        system?: string;
        /** 小程序APPID */
        appId?: string;
        /** 浏览器 userAgent */
        userAgent?: string;
      } & Partial<Bowser.Parser.ParsedResult>,
    ) {
      let keys = [];
      // 小程序的 webview 中
      if (lodash.some(['MiniProgramEnv', 'miniProgram'], agent => lodash.includes(lodash.toLower(SystemInfo.userAgent), lodash.toLower(agent)))) {
        // const system = lodash.join(
        //   [SystemInfo.os.name, SystemInfo.os.version],
        //   ' ',
        // );
        // const version = lodash.join(
        //   lodash.take(lodash.split(SystemInfo.browser.version, '.'), 3),
        //   '.',
        // );
        keys = [day]//lodash.concat(keys, [version]);
      } else if (SystemInfo.system) {
        // 小程序中
        keys = [day]//lodash.concat(keys, [SystemInfo.version]);
      }
      const keyStr = lodash.join(keys, ' ');
      AuthEncryption.AES_Config.AES_Key = CryptoUtf8.parse(keyStr);
      AuthEncryption.AES_Config.AES_IV = CryptoHex.parse(keyStr);
      lodash.delay(
        () => console.log('Encryption', SystemInfo, keyStr),
        1000,
      );
    },
  };
  /**
   * 加密
   * @static
   * @param {string} message
   * @return {*}
   * @memberof Encryption
   */
  static AES_Encrypt(message: string) {
    try {
      let srcs = CryptoUtf8.parse(message);
      let encrypted = CryptoAes.encrypt(srcs, AuthEncryption.AES_Config.AES_Key, {
        iv: AuthEncryption.AES_Config.AES_IV,
        mode: CryptoCfb,
        padding: CryptoPkcs7,
      });
      return encrypted.ciphertext.toString().toUpperCase();
    } catch (error) {
      console.error('LENG ~ Encryption ~ AES_Encrypt ~ error', error);
      return '';
    }
  }
  /**
   * 解密
   * @static
   * @param {string} message
   * @return {*}
   * @memberof Encryption
   */
  static AES_Decrypt(message: string) {
    try {
      let encryptedHexStr = CryptoHex.parse(message);
      let srcs = CryptoBase64.stringify(encryptedHexStr);
      let decrypt = CryptoAes.decrypt(srcs, AuthEncryption.AES_Config.AES_Key, {
        iv: AuthEncryption.AES_Config.AES_IV,
        mode: CryptoCfb,
        padding: CryptoPkcs7,
      });
      let decryptedStr = decrypt.toString(CryptoUtf8);
      return decryptedStr.toString();
    } catch (error) {
      console.error('LENG ~ Encryption ~ AES_Decrypt ~ error', error);
      return '';
    }
  }
}
