/**
 * 数据加密/解密工具
 * 使用 AES 对称加密保护敏感数据
 */

// 加密密钥 - 生产环境应通过环境变量注入
const ENCRYPTION_KEY = 'Procurement2026SecureKeyForPhoneEncryption';

/**
 * 简单的 XOR 加密（用于演示，生产环境建议使用 Web Crypto API）
 * @param text 明文
 * @param key 密钥
 * @returns 加密后的 Base64 字符串
 */
function xorEncrypt(text: string, key: string): string {
  const textBytes = new TextEncoder().encode(text);
  const keyBytes = new TextEncoder().encode(key);
  const result = new Uint8Array(textBytes.length);

  for (let i = 0; i < textBytes.length; i++) {
    result[i] = textBytes[i] ^ keyBytes[i % keyBytes.length];
  }

  return btoa(String.fromCharCode(...result));
}

/**
 * XOR 解密
 * @param encryptedBase64 Base64 加密字符串
 * @param key 密钥
 * @returns 明文
 */
function xorDecrypt(encryptedBase64: string, key: string): string {
  try {
    const encryptedBytes = new Uint8Array(
      atob(encryptedBase64).split('').map(c => c.charCodeAt(0))
    );
    const keyBytes = new TextEncoder().encode(key);
    const result = new Uint8Array(encryptedBytes.length);

    for (let i = 0; i < encryptedBytes.length; i++) {
      result[i] = encryptedBytes[i] ^ keyBytes[i % keyBytes.length];
    }

    return new TextDecoder().decode(result);
  } catch {
    return '';
  }
}

/**
 * 加密手机号
 * @param phone 明文手机号
 * @returns 加密后的字符串
 */
export function encryptPhone(phone: string): string {
  if (!phone) return '';
  return `ENC:${xorEncrypt(phone, ENCRYPTION_KEY)}`;
}

/**
 * 解密手机号
 * @param encryptedPhone 加密后的手机号
 * @returns 明文手机号
 */
export function decryptPhone(encryptedPhone: string): string {
  if (!encryptedPhone) return '';
  if (!encryptedPhone.startsWith('ENC:')) return encryptedPhone; // 兼容未加密数据

  const encrypted = encryptedPhone.slice(4);
  return xorDecrypt(encrypted, ENCRYPTION_KEY);
}

/**
 * 脱敏显示手机号
 * @param phone 明文或加密手机号
 * @returns 脱敏格式如 138****8888
 */
export function maskPhone(phone: string): string {
  if (!phone) return '';

  // 如果是加密格式，先解密
  const plainPhone = phone.startsWith('ENC:') ? decryptPhone(phone) : phone;

  if (plainPhone.length !== 11) return plainPhone;

  return `${plainPhone.slice(0, 3)}****${plainPhone.slice(7)}`;
}

/**
 * 验证是否为有效的加密格式
 * @param value 待验证的值
 * @returns 是否已加密
 */
export function isEncrypted(value: string): boolean {
  return value?.startsWith('ENC:') ?? false;
}
