package com.gxwebsoft.test;

import com.gxwebsoft.common.core.config.CertificateProperties;
import com.gxwebsoft.common.core.service.PaymentCacheService;
import com.gxwebsoft.common.core.utils.CertificateLoader;
import com.gxwebsoft.common.system.entity.Payment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * 微信支付路径处理测试
 * 
 * @author 科技小王子
 * @since 2025-07-29
 */
@SpringBootTest
public class WechatPayPathTest {

    @Autowired
    private PaymentCacheService paymentCacheService;
    
    @Autowired
    private CertificateLoader certificateLoader;
    
    @Autowired
    private CertificateProperties certConfig;

    @Test
    public void testPublicKeyPathHandling() {
        try {
            System.out.println("=== 微信支付公钥路径处理测试 ===");
            
            // 测试租户ID
            Integer tenantId = 10547;
            
            // 获取支付配置
            Payment payment = paymentCacheService.getWechatPayConfig(tenantId);
            if (payment == null) {
                System.err.println("❌ 支付配置不存在");
                return;
            }
            
            System.out.println("数据库配置信息:");
            System.out.println("租户ID: " + tenantId);
            System.out.println("商户号: " + payment.getMchId());
            System.out.println("公钥文件配置: " + payment.getPubKey());
            System.out.println("公钥ID: " + payment.getPubKeyId());
            
            // 测试路径处理逻辑
            if (payment.getPubKey() != null && !payment.getPubKey().isEmpty()) {
                System.out.println("\n=== 路径处理测试 ===");
                
                String pubKeyPath;
                if (payment.getPubKey().startsWith("dev/wechat/") || payment.getPubKey().startsWith("/")) {
                    // 如果数据库中存储的是完整路径，直接使用
                    pubKeyPath = payment.getPubKey();
                    System.out.println("✅ 检测到完整路径，直接使用: " + pubKeyPath);
                } else {
                    // 如果是相对路径，需要拼接租户目录
                    String tenantCertPath = "dev/wechat/" + tenantId;
                    pubKeyPath = tenantCertPath + "/" + payment.getPubKey();
                    System.out.println("✅ 检测到相对路径，拼接后: " + pubKeyPath);
                }
                
                // 测试文件是否存在
                System.out.println("\n=== 文件存在性检查 ===");
                if (certificateLoader.certificateExists(pubKeyPath)) {
                    try {
                        String actualPath = certificateLoader.loadCertificatePath(pubKeyPath);
                        System.out.println("✅ 公钥文件存在: " + actualPath);
                        
                        // 检查文件大小
                        java.io.File file = new java.io.File(actualPath);
                        if (file.exists()) {
                            System.out.println("文件大小: " + file.length() + " 字节");
                            System.out.println("文件可读: " + file.canRead());
                        }
                    } catch (Exception e) {
                        System.err.println("❌ 加载公钥文件失败: " + e.getMessage());
                    }
                } else {
                    System.err.println("❌ 公钥文件不存在: " + pubKeyPath);
                    
                    // 提供修复建议
                    System.out.println("\n=== 修复建议 ===");
                    if (payment.getPubKey().contains("/")) {
                        System.out.println("1. 检查数据库中的路径是否正确");
                        System.out.println("2. 确认文件是否已上传到指定位置");
                        System.out.println("3. 当前配置的路径: " + payment.getPubKey());
                    } else {
                        System.out.println("1. 将公钥文件放置到: src/main/resources/dev/wechat/" + tenantId + "/");
                        System.out.println("2. 或者更新数据库配置为完整路径");
                    }
                }
                
                // 测试其他证书文件
                System.out.println("\n=== 其他证书文件检查 ===");
                String tenantCertPath = "dev/wechat/" + tenantId;
                String privateKeyPath = tenantCertPath + "/" + certConfig.getWechatPay().getDev().getPrivateKeyFile();
                String merchantCertPath = tenantCertPath + "/" + certConfig.getWechatPay().getDev().getApiclientCertFile();
                
                System.out.println("私钥文件: " + privateKeyPath + " - " + 
                    (certificateLoader.certificateExists(privateKeyPath) ? "✅ 存在" : "❌ 不存在"));
                System.out.println("商户证书: " + merchantCertPath + " - " + 
                    (certificateLoader.certificateExists(merchantCertPath) ? "✅ 存在" : "❌ 不存在"));
                
            } else {
                System.out.println("⚠️ 未配置公钥信息");
            }
            
            System.out.println("\n=== 测试完成 ===");
            
        } catch (Exception e) {
            System.err.println("❌ 测试失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    @Test
    public void testCreateCorrectDirectoryStructure() {
        System.out.println("=== 创建正确的目录结构建议 ===");
        
        try {
            Integer tenantId = 10547;
            Payment payment = paymentCacheService.getWechatPayConfig(tenantId);
            
            if (payment != null && payment.getPubKey() != null) {
                System.out.println("当前数据库配置的公钥路径: " + payment.getPubKey());
                
                if (payment.getPubKey().contains("/")) {
                    // 包含路径分隔符，说明是完整路径
                    System.out.println("\n建议的文件放置位置:");
                    System.out.println("src/main/resources/" + payment.getPubKey());
                    
                    // 创建目录的命令
                    String dirPath = payment.getPubKey().substring(0, payment.getPubKey().lastIndexOf("/"));
                    System.out.println("\n创建目录的命令:");
                    System.out.println("mkdir -p src/main/resources/" + dirPath);
                    
                    // 复制文件的命令
                    System.out.println("\n如果您有公钥文件，可以这样复制:");
                    System.out.println("cp your_public_key.pem src/main/resources/" + payment.getPubKey());
                } else {
                    // 只是文件名，需要放在租户目录下
                    System.out.println("\n建议的文件放置位置:");
                    System.out.println("src/main/resources/dev/wechat/" + tenantId + "/" + payment.getPubKey());
                    
                    System.out.println("\n或者更新数据库配置为:");
                    System.out.println("UPDATE sys_payment SET pub_key = 'dev/wechat/" + tenantId + "/" + payment.getPubKey() + "' WHERE tenant_id = " + tenantId + " AND type = 0;");
                }
            }
            
        } catch (Exception e) {
            System.err.println("获取配置失败: " + e.getMessage());
        }
    }
}
