package main

import (
	"os"
	"os/signal"
	"syscall"

	"git.pyer.club/kingecg/godaemon"
	"git.pyer.club/kingecg/gologger"
)

// main 函数是程序的入口点
func main() {
	// 加载配置文件
	LoadConfig()
	// 获取日志记录器
	l := gologger.GetLogger("main")
	// 使用 defer 和 recover 捕获 panic，确保程序不会因未处理的异常而崩溃
	defer func() {
		if err := recover(); err != nil {
			l.Error("panic", err)
		}
	}()
	// 创建守护进程实例
	daemon := godaemon.NewGoDaemon(start, stop)
	// 启动守护进程
	daemon.Start()
}

// waiter 用于接收系统信号
var waiter chan os.Signal

// start 函数是守护进程启动时执行的函数
func start(g *godaemon.GoDaemon) {
	// 创建缓冲通道用于接收系统信号
	waiter = make(chan os.Signal, 1)
	// 监听 SIGTERM 和 SIGINT 信号
	signal.Notify(waiter, syscall.SIGTERM, syscall.SIGINT)

	// 创建 HTTP 服务器实例
	httpd := &GoHttp{}

	// 启动 HTTP 服务器
	httpd.Start()

	// 阻塞等待信号
	<-waiter
	// 记录退出日志
	httpd.logger.Info("Exit")
}

// stop 函数是守护进程停止时执行的函数
func stop(g *godaemon.GoDaemon) {
	// 发送 SIGTERM 信号给当前进程
	g.Running.Process.Signal(syscall.SIGTERM)
}