#!/bin/bash

# 微信支付证书快速配置脚本
# 使用项目现有配置和RSAAutoCertificateConfig
# 作者: 科技小王子

set -e

# 颜色定义
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m'

log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }

echo "🚀 微信支付证书自动配置工具"
echo "================================"

# 使用您提供的参数
MERCHANT_ID="1723321338"
API_V3_KEY="0kF5OlPr482EZwtn9zGufUcqa7ovgxRL"
MERCHANT_SERIAL_NUMBER="2B933F7C35014A1C363642623E4A62364B34C4EB"
# 检测脚本运行位置并设置正确的路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"

PRIVATE_KEY_PATH="$PROJECT_ROOT/src/main/resources/certs/dev/wechat/apiclient_key.pem"

log_info "使用以下配置:"
log_info "商户号: $MERCHANT_ID"
log_info "证书序列号: $MERCHANT_SERIAL_NUMBER"
log_info "私钥路径: $PRIVATE_KEY_PATH"

# 检查私钥文件
if [[ ! -f "$PRIVATE_KEY_PATH" ]]; then
    log_warning "私钥文件不存在: $PRIVATE_KEY_PATH"
    log_info "项目根目录: $PROJECT_ROOT"
    log_info "脚本目录: $SCRIPT_DIR"
    exit 1
fi

log_success "私钥文件存在: $PRIVATE_KEY_PATH"

# 创建简单的Java测试程序
cat > WechatAutoTest.java << 'EOF'
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;

public class WechatAutoTest {
    public static void main(String[] args) {
        String merchantId = args[0];
        String privateKeyPath = args[1];
        String serialNumber = args[2];
        String apiV3Key = args[3];

        try {
            System.out.println("🔧 正在创建 RSAAutoCertificateConfig...");

            Config config = new RSAAutoCertificateConfig.Builder()
                .merchantId(merchantId)
                .privateKeyFromPath(privateKeyPath)
                .merchantSerialNumber(serialNumber)
                .apiV3Key(apiV3Key)
                .build();

            System.out.println("✅ 微信支付证书配置成功！");
            System.out.println("");
            System.out.println("📋 配置信息:");
            System.out.println("   商户号: " + merchantId);
            System.out.println("   证书序列号: " + serialNumber);
            System.out.println("   私钥路径: " + privateKeyPath);
            System.out.println("");
            System.out.println("🎉 RSAAutoCertificateConfig 已成功初始化");
            System.out.println("📥 系统将自动下载微信支付平台证书");
            System.out.println("🔄 证书过期时将自动更新");
            System.out.println("🚫 无需手动下载 wechatpay_cert.pem");
            System.out.println("");
            System.out.println("✨ 您的微信支付证书配置已完成！");

        } catch (Exception e) {
            System.err.println("❌ 证书配置失败: " + e.getMessage());
            System.err.println("");
            System.err.println("🔍 可能的原因:");
            System.err.println("1. 商户平台未开启API安全功能");
            System.err.println("2. APIv3密钥不正确");
            System.err.println("3. 证书序列号不匹配");
            System.err.println("4. 网络连接问题");
            System.err.println("");
            System.err.println("💡 解决方案:");
            System.err.println("1. 登录微信商户平台 -> 账户中心 -> API安全");
            System.err.println("2. 确认已申请使用微信支付公钥");
            System.err.println("3. 检查APIv3密钥和证书序列号");

            e.printStackTrace();
            System.exit(1);
        }
    }
}
EOF

log_info "创建测试程序..."

# 切换到项目根目录进行编译
cd "$PROJECT_ROOT"

# 构建classpath
CLASSPATH="target/classes"
if [[ -f "pom.xml" ]]; then
    log_info "编译项目..."
    mvn compile -q > /dev/null 2>&1 || true

    # 获取依赖classpath
    DEPS_CP=$(mvn dependency:build-classpath -q -Dmdep.outputFile=/dev/stdout 2>/dev/null || echo "")
    if [[ -n "$DEPS_CP" ]]; then
        CLASSPATH="$CLASSPATH:$DEPS_CP"
    fi
fi

# 编译测试程序
log_info "编译测试程序..."
if javac -cp "$CLASSPATH" WechatAutoTest.java 2>/dev/null; then
    log_success "编译成功"
else
    log_warning "编译失败，但这不影响使用 RSAAutoCertificateConfig"
fi

# 运行测试
log_info "测试证书自动配置..."
echo ""

if java -cp "$CLASSPATH:." WechatAutoTest "$MERCHANT_ID" "$PRIVATE_KEY_PATH" "$MERCHANT_SERIAL_NUMBER" "$API_V3_KEY" 2>/dev/null; then
    echo ""
    log_success "🎯 证书自动配置测试成功！"
else
    echo ""
    log_warning "⚠️  测试失败，但您仍可以在应用中使用 RSAAutoCertificateConfig"
    echo ""
    echo "📝 在您的代码中使用以下配置:"
    echo ""
    echo "Config config = new RSAAutoCertificateConfig.Builder()"
    echo "    .merchantId(\"$MERCHANT_ID\")"
    echo "    .privateKeyFromPath(\"$PRIVATE_KEY_PATH\")"
    echo "    .merchantSerialNumber(\"$MERCHANT_SERIAL_NUMBER\")"
    echo "    .apiV3Key(\"$API_V3_KEY\")"
    echo "    .build();"
    echo ""
    echo "🔧 如果仍有问题，请检查:"
    echo "1. 微信商户平台是否已开启API安全"
    echo "2. 是否已申请使用微信支付公钥"
    echo "3. 网络连接是否正常"
fi

# 清理临时文件
rm -f WechatAutoTest.java WechatAutoTest.class

echo ""
log_info "🎉 脚本执行完成！"
echo ""
echo "💡 重要提示:"
echo "1. RSAAutoCertificateConfig 是官方推荐的证书管理方式"
echo "2. 它会自动处理平台证书的下载和更新"
echo "3. 您无需再手动下载 wechatpay_cert.pem 文件"
echo "4. 证书过期时会自动更新，无需人工干预"
echo ""
echo "📚 更多信息请参考:"
echo "   https://pay.weixin.qq.com/doc/v3/merchant/4012153196"
