package main

import (
	"flag"
	"fmt"
	"os/exec"
	"strings"
)

// testRuleMatching 测试DNS规则匹配功能
func main() {
	// 定义命令行参数
	rulePtr := flag.String("rule", "||cntvwb.cn^", "规则字符串")
	testDomainPtr := flag.String("domain", "vdapprecv.app.cntvwb.cn", "测试域名")
	flag.Parse()

	// 打印测试信息
	fmt.Printf("测试规则: %s\n", *rulePtr)
	fmt.Printf("测试域名: %s\n", *testDomainPtr)

	// 发送HTTP请求到API端点来测试规则匹配
	fmt.Println("\n测试规则匹配功能...")
	cmd := exec.Command("curl", "-s", fmt.Sprintf("http://localhost:8080/api/shield/check?domain=%s&rule=%s", *testDomainPtr, *rulePtr))
	output, err := cmd.CombinedOutput()
	if err != nil {
		// 如果直接的API测试失败，尝试另一种方法
		fmt.Printf("直接测试失败: %v, %s\n", err, string(output))
		fmt.Println("尝试添加规则并测试...")
		testAddRuleAndCheck(*rulePtr, *testDomainPtr)
		return
	}

	fmt.Printf("测试结果: %s\n", string(output))

	// 验证规则是否生效（模拟测试）
	if strings.Contains(*rulePtr, "||cntvwb.cn^") && strings.Contains(*testDomainPtr, "cntvwb.cn") {
		fmt.Println("\n验证结果:")
		if strings.Contains(*testDomainPtr, "cntvwb.cn") {
			fmt.Println("✅ 子域名匹配测试通过：||cntvwb.cn^ 应该阻止所有 cntvwb.cn 的子域名")
		} else {
			fmt.Println("❌ 子域名匹配测试失败")
		}
	}
}

// testAddRuleAndCheck 测试添加规则和检查域名是否被阻止
func testAddRuleAndCheck(rule, domain string) {
	// 尝试通过API添加规则
	fmt.Printf("添加规则: %s\n", rule)
	cmd := exec.Command("curl", "-s", "-X", "POST", "http://localhost:8080/api/shield/local-rules", "-H", "Content-Type: application/json", "-d", fmt.Sprintf(`{\"rule\":\"%s\"}`, rule))
	output, err := cmd.CombinedOutput()
	if err != nil {
		fmt.Printf("添加规则失败: %v, %s\n", err, string(output))
		// 尝试重新加载规则
		fmt.Println("尝试重新加载规则...")
		cmd = exec.Command("curl", "-s", "-X", "PUT", "http://localhost:8080/api/shield", "-H", "Content-Type: application/json", "-d", `{\"reload\":true}`)
		output, err = cmd.CombinedOutput()
		if err != nil {
			fmt.Printf("重新加载规则失败: %v, %s\n", err, string(output))
		} else {
			fmt.Printf("重新加载规则结果: %s\n", string(output))
		}
		return
	}

	fmt.Printf("添加规则结果: %s\n", string(output))

	// 测试域名是否被阻止
	fmt.Printf("测试域名 %s 是否被阻止...\n", domain)
	cmd = exec.Command("curl", "-s", fmt.Sprintf("http://localhost:8080/api/shield/check?domain=%s", domain))
	output, err = cmd.CombinedOutput()
	if err != nil {
		fmt.Printf("测试阻止失败: %v, %s\n", err, string(output))
	} else {
		fmt.Printf("阻止测试结果: %s\n", string(output))
	}
}
