package main

import (
	"flag"
	"fmt"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"

	"sms-receiver-go/auth"
	"sms-receiver-go/config"
	"sms-receiver-go/database"
	"sms-receiver-go/handlers"

	"github.com/gorilla/mux"
	"github.com/robfig/cron/v3"
)

// 编译时注入的版本信息
var (
	Version    = "dev"        // 版本号
	BuildTime  = "unknown"    // 构建时间
	GitCommit  = "unknown"    // Git commit hash
	GoVersion  = "unknown"    // Go 版本
	BuildEnv   = "dev"        // 构建环境（dev/prod）
)

func printVersion() {
	fmt.Printf("SmsReceiver-go %s\n", Version)
	fmt.Printf("  Version:    %s\n", Version)
	fmt.Printf("  Build Env:  %s\n", BuildEnv)
	fmt.Printf("  Build Time: %s\n", BuildTime)
	fmt.Printf("  Git Commit: %s\n", GitCommit)
	fmt.Printf("  Go Version: %s\n", GoVersion)
	fmt.Printf("  Repository: https://gitea.king.nyc.mn/openclaw/SmsReceiver-go\n")
}

func main() {
	// 检查是否请求版本信息（需要在 flag.Parse 之前）
	for _, arg := range os.Args[1:] {
		if arg == "--version" || arg == "-v" {
			printVersion()
			os.Exit(0)
		} else if arg == "--help" || arg == "-h" {
			fmt.Println("SmsReceiver-go - 短信转发接收端 Go 版本")
			fmt.Println()
			fmt.Println("Usage:")
			fmt.Println("  sms-receiver-v2 [options]")
			fmt.Println()
			fmt.Println("Options:")
			flag.PrintDefaults()
			fmt.Println()
			fmt.Println("Additional Options:")
			fmt.Println("  -v, --version     显示版本信息")
			fmt.Println("  -h, --help        显示帮助信息")
			os.Exit(0)
		}
	}

	// 记录启动时间
	startTime := time.Now()

	// 打印启动信息
	log.Printf("========================================")
	log.Printf("SmsReceiver-go v%s (%s)", Version, BuildEnv)
	log.Printf("========================================")
	log.Printf("Version:    %s", Version)
	log.Printf("Build Env:  %s", BuildEnv)
	log.Printf("Build Time: %s", BuildTime)
	log.Printf("Git Commit: %s", GitCommit)
	log.Printf("Go Version: %s", GoVersion)
	log.Printf("========================================")

	// 命令行参数
	configPath := flag.String("config", "config.yaml", "配置文件路径")
	templatesPath := flag.String("templates", "templates", "模板目录路径")
	flag.Parse()

	// 加载配置
	cfg, err := config.Load(*configPath)
	if err != nil {
		log.Fatalf("加载配置失败: %v", err)
	}
	log.Printf("配置加载成功: %s v%s", cfg.App.Name, cfg.App.Version)

	// 初始化数据库
	if err := database.Init(&cfg.Database); err != nil {
		log.Fatalf("初始化数据库失败: %v", err)
	}
	defer database.Close()

	// 初始化会话存储
	auth.Init(cfg.Security.SecretKey)

	// 验证密钥配置
	if len(cfg.Security.SecretKey) < 16 {
		log.Printf("警告: 安全密钥长度不足，建议至少16字节（当前: %d 字节）", len(cfg.Security.SecretKey))
	}

	// 初始化模板
	if err := handlers.InitTemplates(*templatesPath); err != nil {
		log.Fatalf("初始化模板失败: %v", err)
	}

	// 创建路由器
	r := mux.NewRouter()

	// 静态文件
	r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))

	// 页面路由
	r.HandleFunc("/", handlers.Index)
	r.HandleFunc("/login", handlers.Login)
	r.HandleFunc("/logout", handlers.Logout)
	r.HandleFunc("/message/{id}", handlers.MessageDetail)
	r.HandleFunc("/logs", handlers.Logs)
	r.HandleFunc("/statistics", handlers.Statistics)

	// API 路由（v1）
	apiV1 := r.PathPrefix("/api/v1").Subrouter()
	apiV1.HandleFunc("/receive", handlers.ReceiveSMS)
	apiV1.HandleFunc("/messages", handlers.APIGetMessages)
	apiV1.HandleFunc("/statistics", handlers.APIStatistics)

	// 兼容旧版 API（无版本号）
	r.HandleFunc("/api/receive", handlers.ReceiveSMS)
	r.HandleFunc("/api/messages", handlers.APIGetMessages)
	r.HandleFunc("/api/statistics", handlers.APIStatistics)

	// 健康检查
	r.HandleFunc("/health", handlers.HealthCheck(startTime))

	// 配置服务器
	server := &http.Server{
		Addr:         cfg.GetServerAddress(),
		Handler:      r,
		ReadTimeout:  30 * time.Second,
		WriteTimeout: 30 * time.Second,
		IdleTimeout:  60 * time.Second,
	}

	// 启动后台清理任务
	cronInstance := startCleanupTask(cfg)
	defer cronInstance.Stop()

	// 优雅关闭
	go func() {
		sigChan := make(chan os.Signal, 1)
		signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
		<-sigChan

		log.Println("正在关闭服务...")
		server.Close()
	}()

	log.Printf("服务启动: http://%s", cfg.GetServerAddress())
	if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
		log.Fatalf("服务器启动失败: %v", err)
	}
}

// startCleanupTask 启动定期清理任务
func startCleanupTask(cfg *config.Config) *cron.Cron {
	if !cfg.SMS.AutoCleanup {
		log.Println("自动清理功能未启用")
		return cron.New(cron.WithSeconds())
	}

	// 创建 cron 实例
	c := cron.New(cron.WithSeconds())

	// 每天凌晨 3 点执行清理任务
	_, err := c.AddFunc("0 0 3 * * *", func() {
		log.Println("开始执行自动清理任务...")
		deleted, err := database.CleanupOldMessages(cfg.SMS.CleanupDays)
		if err != nil {
			log.Printf("清理旧消息失败: %v", err)
		} else {
			log.Printf("自动清理旧消息完成: 删除 %d 条记录", deleted)
		}
	})

	if err != nil {
		log.Printf("添加清理任务失败: %v", err)
		return c
	}

	// 启动 cron 服务
	c.Start()
	log.Println("自动清理任务已启动: 每天 03:00 执行")

	return c
}
