package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"os/signal"
	"syscall"

	"dns-server/config"
	"dns-server/dns"
	"dns-server/http"
	"dns-server/logger"
	"dns-server/shield"
)

func main() {
	// 解析命令行参数
	configPath := flag.String("config", "config.json", "配置文件路径")
	flag.Parse()

	// 初始化配置
	cfg, err := config.LoadConfig(*configPath)
	if err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}

	// 初始化日志系统
	if err := logger.InitLogger(cfg.Log.File, cfg.Log.Level, 0, 0, 0); err != nil {
		log.Fatalf("初始化日志系统失败: %v", err)
	}
	defer logger.Close()

	// 初始化屏蔽管理系统
	shieldManager := shield.NewShieldManager(&cfg.Shield)
	if err := shieldManager.LoadRules(); err != nil {
		logger.Error("加载屏蔽规则失败", "error", err)
	}

	// 启动DNS服务器
	dnsServer := dns.NewServer(&cfg.DNS, &cfg.Shield, shieldManager)
	go func() {
		if err := dnsServer.Start(); err != nil {
			logger.Error("DNS服务器启动失败", "error", err)
			os.Exit(1)
		}
	}()

	// 启动HTTP控制台服务器
	httpServer := http.NewServer(cfg, dnsServer, shieldManager)
	go func() {
		if err := httpServer.Start(); err != nil {
			logger.Error("HTTP控制台服务器启动失败", "error", err)
		}
	}()

	// 启动定时更新任务
	go shieldManager.StartAutoUpdate()

	logger.Info(fmt.Sprintf("DNS服务器已启动，监听端口: %d", cfg.DNS.Port))
	logger.Info(fmt.Sprintf("HTTP控制台已启动，监听端口: %d", cfg.HTTP.Port))

	// 等待退出信号
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
	<-sigChan

	logger.Info("正在关闭服务...")
	dnsServer.Stop()
	httpServer.Stop()
	shieldManager.StopAutoUpdate()
	logger.Info("所有服务已关闭")
}
