package com.qqchen.deploy.backend.framework.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 敏感数据加密服务类（Spring组件）
 * 从配置文件读取密钥和盐值，委托给 EncryptionUtils 执行加密解密
 * 
 * 设计说明：
 * - 本类是Spring组件，可自动注入，从配置文件读取密钥
 * - 实际加密解密委托给 EncryptionUtils 静态工具类
 * - EncryptionUtils 可独立使用，无需Spring容器
 * 
 * @author qqchen
 * @since 2025-11-11
 */
@Slf4j
@Component
public class SensitiveDataEncryptor {

    /**
     * 密码掩码（用于前端显示）
     */
    public static final String PASSWORD_MASK = EncryptionUtils.PASSWORD_MASK;

    /**
     * 从配置文件读取加密密钥
     */
    @Value("${deploy.encryption.secret-key}")
    private String secretKey;

    /**
     * 从配置文件读取加密盐值
     */
    @Value("${deploy.encryption.salt}")
    private String salt;

    /**
     * 加密明文
     * 
     * @param plainText 明文
     * @return 加密后的文本，如果输入为空则返回null
     */
    public String encrypt(String plainText) {
        if (StringUtils.isBlank(plainText)) {
            return null;
        }
        try {
            return EncryptionUtils.encrypt(plainText, secretKey, salt);
        } catch (Exception e) {
            log.error("加密失败", e);
            throw new RuntimeException("数据加密失败", e);
        }
    }

    /**
     * 解密密文
     * 
     * @param encryptedText 密文
     * @return 解密后的明文，如果输入为空则返回null
     */
    public String decrypt(String encryptedText) {
        if (StringUtils.isBlank(encryptedText)) {
            return null;
        }
        try {
            return EncryptionUtils.decrypt(encryptedText, secretKey, salt);
        } catch (Exception e) {
            log.error("解密失败，可能是明文或密钥错误", e);
            // 如果解密失败，可能是旧数据（明文），直接返回
            return encryptedText;
        }
    }

    /**
     * 判断字符串是否为掩码
     * 
     * @param value 要判断的字符串
     * @return true表示是掩码
     */
    public static boolean isMasked(String value) {
        return EncryptionUtils.isMasked(value);
    }

    /**
     * 如果有值则返回掩码，否则返回null
     * 
     * @param value 原始值
     * @return 掩码或null
     */
    public static String maskIfPresent(String value) {
        return StringUtils.isNotBlank(value) ? PASSWORD_MASK : null;
    }
}
