import { sm2, sm3, sm4 } from 'sm-crypto';

/**
 * SM国密算法工具类
 * 包含SM2非对称加密、SM3哈希算法和SM4对称加密
 */

// 加密模式：1 - C1C3C2，0 - C1C2C3，默认为1
const cipherMode = 1;

// 从环境变量中获取SM2密钥（作为默认密钥）
const defaultPublicKey = import.meta.env.VITE_APP_S2_PUB_K;
const defaultPrivateKey = import.meta.env.VITE_APP_S2_PRI_K;

/**
 * SM2非对称加密（支持自定义公钥）
 * @param msgString 待加密的明文字符串
 * @param customPublicKey 可选的自定义公钥，如果不提供则使用默认公钥
 * @returns 十六进制格式的密文
 */
export const sm2Encrypt = (msgString: string, customPublicKey?: string): string => {
  const publicKeyToUse = customPublicKey || defaultPublicKey;
  if (!publicKeyToUse) {
    throw new Error('SM2公钥未配置');
  }
  return sm2.doEncrypt(msgString, publicKeyToUse, cipherMode);
};

/**
 * SM2非对称解密（支持自定义私钥）
 * @param encryptData 十六进制格式的密文
 * @param customPrivateKey 可选的自定义私钥，如果不提供则使用默认私钥
 * @returns 解密后的明文
 */
export const sm2Decrypt = (encryptData: string, customPrivateKey?: string): string => {
  const privateKeyToUse = customPrivateKey || defaultPrivateKey;
  if (!privateKeyToUse) {
    throw new Error('SM2私钥未配置');
  }
  return sm2.doDecrypt(encryptData, privateKeyToUse, cipherMode);
};

/**
 * SM3哈希算法
 * @param msgString 待计算哈希的字符串
 * @param options 可选参数
 * @returns 哈希值（十六进制格式）
 */
export const sm3Encrypt = (msgString: string, options?: object): string => {
  return sm3(msgString, options);
};

/**
 * SM4对称加密
 * @param msg 待加密的明文
 * @param key 十六进制格式的密钥（长度为32的十六进制字符串，对应16字节）
 * @returns 十六进制格式的密文
 */
export const sm4Encrypt = (msg: string, key: string): string => {
  const options = {
    padding: 'pkcs#5', // 填充方式
    mode: 'cbc', // 加密模式：CBC
    iv: key // 初始化向量，使用密钥作为IV
  };
  return sm4.encrypt(msg, key, options);
};

/**
 * SM4对称解密
 * @param  十六进制格式的密文
 * @param  十六进制格式的密钥（长度为32的十六进制字符串，对应16字节）
 * @returns 解密后的明文
 */
export const sm4Decrypt = (encryptData: string, key: string): string => {
  const options = {
    padding: 'pkcs#5', // 填充方式
    mode: 'cbc', // 加密模式：CBC
    iv: key, // 初始化向量，使用密钥作为IV
    output: 'string' // 输出格式为字符串
  };
  return sm4.decrypt(encryptData, key, options);
};
