package org.jeecg.modules.pay.paytest;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.security.cert.X509Certificate;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

//@Service
@Slf4j
public class WechatCertificateService {

    //    @Resource
    private WechatPayProperties properties;

    private final Map<String, X509Certificate> certificateCache = new ConcurrentHashMap<>();

//    // 初始化证书加载
//    @PostConstruct
//    public void init() {
//        properties.getCertificates().forEach(cert -> {
//            try {
//                certificateCache.put(cert.getSerialNo(), loadCertificate(cert));
//            } catch (Exception e) {
//                log.error("证书加载失败: {}", cert.getSerialNo(), e);
//            }
//        });
//    }
//
//    // 动态获取证书
//    public X509Certificate getCertificate(String serialNo) throws Exception {
//        if (certificateCache.containsKey(serialNo)) {
//            return certificateCache.get(serialNo);
//        }
//
//        // 调用微信接口获取证书列表
//        List<Certificate> certs = getCertificatesFromApi();
//        Certificate targetCert = certs.stream()
//                .filter(c -> c.getSerialNo().equals(serialNo))
//                .findFirst()
//                .orElseThrow(() -> new RuntimeException("未找到有效证书"));
//
//        // 解密证书
//        String decryptedCert = decryptCertificate(
//                targetCert.getEncryptCertificate().getAssociatedData(),
//                targetCert.getEncryptCertificate().getNonce(),
//                targetCert.getEncryptCertificate().getCiphertext()
//        );
//
//        // 保存证书文件
//        saveCertificateFile(targetCert.getSerialNo(), decryptedCert);
//
//        // 加载证书
//        X509Certificate x509Cert = loadCertificate(decryptedCert);
//        certificateCache.put(serialNo, x509Cert);
//        return x509Cert;
//    }
//
//    // 自动刷新证书
//    @Scheduled(fixedRateString = "${wechat.pay.auto-refresh-interval}000")
//    public void autoRefreshCertificates() {
//        try {
//            List<Certificate> certs = getCertificatesFromApi();
//            certs.forEach(cert -> {
//                String serialNo = cert.getSerialNo();
//                if (!certificateCache.containsKey(serialNo)) {
//                    getCertificate(serialNo); // 触发加载
//                }
//            });
//            log.info("微信证书自动刷新完成，当前缓存证书数：{}", certificateCache.size());
//        } catch (Exception e) {
//            log.error("证书刷新失败", e);
//        }
//    }
//
//    // 调用微信API获取证书列表
//    private List<Certificate> getCertificatesFromApi() throws Exception {
//        CloseableHttpClient httpClient = WechatHttpClientBuilder.create()
//                .withMerchant(properties.getMchId(), properties.getSerialNo(),
//                             privateKeyFromPath(properties.getPrivateKeyPath()))
//                .build();
//
//        HttpGet request = new HttpGet("https://api.mch.weixin.qq.com/v3/certificates");
//        request.setHeader("Accept", MediaType.APPLICATION_JSON_VALUE);
//
//        try (CloseableHttpResponse response = httpClient.execute(request)) {
//            String body = EntityUtils.toString(response.getEntity());
//            return JSON.parseObject(body, CertificatesResponse.class).getData();
//        }
//    }
//
//    // 证书解密工具
//    private String decryptCertificate(String associatedData, String nonce, String ciphertext) {
//        try {
//            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
//            SecretKeySpec keySpec = new SecretKeySpec(
//                    properties.getApiV3Key().getBytes(StandardCharsets.UTF_8),
//                    "AES"
//            );
//            GCMParameterSpec gcmSpec = new GCMParameterSpec(128, nonce.getBytes(StandardCharsets.UTF_8));
//
//            cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmSpec);
//            cipher.updateAAD(associatedData.getBytes(StandardCharsets.UTF_8));
//
//            byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(ciphertext));
//            return new String(decrypted, StandardCharsets.UTF_8);
//        } catch (Exception e) {
//            throw new RuntimeException("证书解密失败", e);
//        }
//    }
//
//    // 证书文件存储
//    private void saveCertificateFile(String serialNo, String certContent) {
//        Path path = Paths.get(properties.getCertDir(), "cert_" + serialNo + ".pem");
//        try {
//            Files.write(path, ("-----BEGIN CERTIFICATE-----\n" + certContent + "\n-----END CERTIFICATE-----").getBytes());
//        } catch (IOException e) {
//            log.error("保存证书失败：{}", path, e);
//        }
//    }
//
//    // 加载证书
//    private X509Certificate loadCertificate(String certContent) throws CertificateException {
//        CertificateFactory cf = CertificateFactory.getInstance("X.509");
//        try (InputStream is = new ByteArrayInputStream(certContent.getBytes())) {
//            return (X509Certificate) cf.generateCertificate(is);
//        }
//    }
//
//    // 私钥加载
//    private PrivateKey privateKeyFromPath(String path) throws Exception {
//        Resource resource = new ClassPathResource(path);
//        try (InputStream is = resource.getInputStream()) {
//            return PemUtils.loadPrivateKey(is);
//        }
//    }
}