package com.dora.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyStore;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

/**
 * 证书文件管理工具类
 */
@Slf4j
@Component
public class CertificateUtil {

    @Value("${wx2.certUrl:}")
    private String certUrl;

    /**
     * 检查证书文件是否存在
     */
    public boolean isCertificateExists() {
        if (certUrl == null || certUrl.trim().isEmpty()) {
            log.warn("微信支付证书路径未配置");
            return false;
        }

        try {
            Path path = Paths.get(certUrl);
            boolean exists = Files.exists(path);
            
            if (exists) {
                log.info("微信支付证书文件存在: {}", certUrl);
                return true;
            } else {
                log.warn("微信支付证书文件不存在: {}", certUrl);
                return false;
            }
        } catch (Exception e) {
            log.error("检查证书文件时发生错误: {}", e.getMessage(), e);
            return false;
        }
    }

    /**
     * 获取证书文件大小
     */
    public long getCertificateFileSize() {
        if (!isCertificateExists()) {
            return -1;
        }

        try {
            Path path = Paths.get(certUrl);
            return Files.size(path);
        } catch (IOException e) {
            log.error("获取证书文件大小时发生错误: {}", e.getMessage(), e);
            return -1;
        }
    }

    /**
     * 验证证书文件格式
     */
    public boolean validateCertificateFormat() {
        if (!isCertificateExists()) {
            return false;
        }

        try {
            // 尝试加载P12格式的证书
            KeyStore keyStore = KeyStore.getInstance("PKCS12");
            try (InputStream inputStream = new FileInputStream(certUrl)) {
                keyStore.load(inputStream, null);
                log.info("证书文件格式验证成功");
                return true;
            }
        } catch (Exception e) {
            log.error("证书文件格式验证失败: {}", e.getMessage());
            return false;
        }
    }

    /**
     * 获取证书文件信息
     */
    public String getCertificateInfo() {
        if (!isCertificateExists()) {
            return "证书文件不存在";
        }

        try {
            Path path = Paths.get(certUrl);
            File file = path.toFile();
            
            StringBuilder info = new StringBuilder();
            info.append("证书文件信息:\n");
            info.append("路径: ").append(certUrl).append("\n");
            info.append("大小: ").append(file.length()).append(" 字节\n");
            info.append("最后修改时间: ").append(file.lastModified()).append("\n");
            info.append("可读: ").append(file.canRead()).append("\n");
            info.append("可执行: ").append(file.canExecute()).append("\n");
            
            return info.toString();
        } catch (Exception e) {
            log.error("获取证书文件信息时发生错误: {}", e.getMessage(), e);
            return "获取证书信息失败: " + e.getMessage();
        }
    }

    /**
     * 检查证书文件权限
     */
    public boolean checkCertificatePermissions() {
        if (!isCertificateExists()) {
            return false;
        }

        try {
            File file = new File(certUrl);
            
            // 检查文件是否可读
            if (!file.canRead()) {
                log.error("证书文件不可读: {}", certUrl);
                return false;
            }
            
            // 检查文件是否为普通文件
            if (!file.isFile()) {
                log.error("证书路径不是文件: {}", certUrl);
                return false;
            }
            
            log.info("证书文件权限检查通过");
            return true;
            
        } catch (Exception e) {
            log.error("检查证书文件权限时发生错误: {}", e.getMessage(), e);
            return false;
        }
    }

    /**
     * 获取证书文件路径
     */
    public String getCertUrl() {
        return certUrl;
    }

    /**
     * 设置证书文件路径
     */
    public void setCertUrl(String certUrl) {
        this.certUrl = certUrl;
    }
} 