package org.xyzh.common.utils.crypto;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;

/**
 * 敏感数据处理工具类
 * 支持加密存储 + 哈希查询
 * 
 * 数据库设计：
 * - phone_encrypted: 加密后的完整手机号（用于显示和解密）
 * - phone_hash: 手机号的哈希值（用于查询，建立索引）
 * 
 * @author yslg
 * @since 2025-12-05
 */
@Component
public class SensitiveDataUtil {

    @Autowired
    private AesEncryptUtil aesEncryptUtil;

    /**
     * 生成 SHA-256 哈希值（用于查询索引）
     */
    public String hash(String plaintext) {
        if (plaintext == null || plaintext.isEmpty()) {
            return null;
        }
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hashBytes = digest.digest(plaintext.getBytes(StandardCharsets.UTF_8));
            return Base64.getEncoder().encodeToString(hashBytes);
        } catch (Exception e) {
            throw new RuntimeException("哈希计算失败", e);
        }
    }

    /**
     * 处理手机号：返回加密值和哈希值
     */
    public PhoneData processPhone(String phone) {
        if (phone == null || phone.isEmpty()) {
            return new PhoneData(null, null);
        }
        return new PhoneData(
            aesEncryptUtil.encryptPhone(phone),
            hash(phone)
        );
    }

    /**
     * 处理身份证号：返回加密值和哈希值
     */
    public IdCardData processIdCard(String idCard) {
        if (idCard == null || idCard.isEmpty()) {
            return new IdCardData(null, null);
        }
        return new IdCardData(
            aesEncryptUtil.encryptIdCard(idCard),
            hash(idCard)
        );
    }

    /**
     * 手机号数据对象
     */
    public static class PhoneData {
        private String encrypted; // 加密后的值（存储在 phone_encrypted）
        private String hash;      // 哈希值（存储在 phone_hash，用于查询）

        public PhoneData(String encrypted, String hash) {
            this.encrypted = encrypted;
            this.hash = hash;
        }

        public String getEncrypted() {
            return encrypted;
        }

        public String getHash() {
            return hash;
        }
    }

    /**
     * 身份证号数据对象
     */
    public static class IdCardData {
        private String encrypted; // 加密后的值
        private String hash;      // 哈希值

        public IdCardData(String encrypted, String hash) {
            this.encrypted = encrypted;
            this.hash = hash;
        }

        public String getEncrypted() {
            return encrypted;
        }

        public String getHash() {
            return hash;
        }
    }
}
