/**
 * 加解密、编码模块
 */

import { logger, Context } from "mslib"
const CryptoJS = require('crypto-js');

/**
 * `crypto-js`加解密, `md5`、`sha1`、`sha256`、`hmac`、`aes`、`des`
 * 
 * @see [crypto-js](https://cryptojs.gitbook.io/docs/)
 */
export class CryptoUtils {
    /**
       * des加密
       */
    static desEncrypt(content: string, key, iv): string {
        let keybyte = CryptoJS.enc.Utf8.parse(key);
        let ivbyte = CryptoJS.enc.Utf8.parse(iv);
        let srcs = CryptoJS.enc.Utf8.parse(content);

        // des3加密 TripleDES
        let encrypted = CryptoJS.TripleDES.encrypt(srcs, keybyte, {
            mode: CryptoJS.mode.CBC, // Mode加密模式：ECB
            padding: CryptoJS.pad.Pkcs7, // Pad填充方式：Pkcs7 
            iv: ivbyte  //注iv是偏移量，如不需要可注释掉
        });
        return encrypted.toString();  //输出的是base64格式的字符串，常规选这种
        //return encrypted.ciphertext.toString().toUpperCase(); //输出的是16进制的字符串
    }

    /**
     * des解密
     */
    static desDecrypt(content: string, key, iv): any {
        const ciphertext = CryptoJS.enc.Base64.parse(content);
        let keybyte = CryptoJS.enc.Utf8.parse(key);
        let ivbyte = CryptoJS.enc.Utf8.parse(iv);

        const decrypted = CryptoJS.TripleDES.decrypt({ ciphertext }, keybyte, {
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7,
            iv: ivbyte // 设置偏移量
        });
        return decrypted.toString(CryptoJS.enc.Utf8);
    }
    // 单元测试可以使用
    static generateDesKeyAndIv() {
        // 生成 8 字节（64 位）的随机 DES 密钥
        const key = CryptoJS.lib.WordArray.random(8);

        // 生成 8 字节（64 位）的随机 IV（偏移量）
        const iv = CryptoJS.lib.WordArray.random(8);

        // 转换为十六进制字符串格式
        const keyHex = key.toString(CryptoJS.enc.Hex);
        const ivHex = iv.toString(CryptoJS.enc.Hex);

        return {
            key: keyHex,
            iv: ivHex
        };
    }

    // static checkCoupon(token, data) {
    //     try {
    //         let plainTextStr = this.desDecrypt(token, Config.getTokenConfig().key, Config.getTokenConfig().iv)
    //         let plainText = JSON.parse(plainTextStr)
    //         let plainTextCoupon = plainText?.CouponData
    //         for (let coupon of data.CouponData) {
    //             //login [{"RuleId":1,"RuleName":"简美会员 ","TicketNo":"w79d4116323","TicketValue":3600,"TicketType":0,"TicketUsed":1,"TicketMsg":"","IsChoose":1,"Condition":"","ExtParam":1}]

    //             // payfeee {"RuleId":1,"RuleName":"简美会员 ","DisAmout":3600,"DisType":0,"TicketNo":"w79d4116323","ExtParam":1}
    //             let checkObj = plainTextCoupon.find(item => item['TicketNo'] == coupon.TicketNo);
    //             if (!checkObj) {
    //                 logger.info('未匹配到')
    //                 return false
    //             }
    //             if (checkObj) {
    //                 if (checkObj?.RuleId != coupon?.RuleId) {
    //                     logger.info('RuleId未匹配到')
    //                     return false
    //                 }
    //                 if (checkObj?.TicketNo != coupon?.TicketNo) {
    //                     logger.info('TicketNo未匹配到')
    //                     return false
    //                 }
    //                 if (checkObj?.TicketValue != coupon?.DisAmout) {
    //                     logger.info('TicketValue未匹配到')
    //                     return false
    //                 }
    //                 if (checkObj?.TicketType != coupon?.DisType) {
    //                     logger.info('DisType未匹配到')
    //                     return false
    //                 }

    //             }

    //         }
    //         return true
    //     } catch (e) {
    //         return false
    //     }
    // }
}