package main

import (
	"context"
	"fengkuangGameServerJob/dao"
	"fengkuangGameServerJob/handler"
	"fengkuangGameServerJob/pkg/feishu"
	"fengkuangGameServerJob/pkg/logging"
	"fengkuangGameServerJob/pkg/setting"
	"fengkuangGameServerJob/routers"
	"flag"
	"fmt"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"

	"github.com/gin-gonic/gin"
)

var (
	runJob int //是否执行定时任务 0不执行 其他都执行(保证只有一个在执行定时任务)
)

func init() {
	setupFlag()
	err := setupSettings()
	if err != nil {
		panic("配置文件初始化失败:" + err.Error())
	}
	err = setupLogger()
	if err != nil {
		panic("日志初始化失败:" + err.Error())
	}
	err = setupDBEngine()
	if err != nil {
		panic("数据库初始化失败:" + err.Error())
	}
	err = setupRDB()
	if err != nil {
		panic("redis初始化失败:" + err.Error())
	}
}

func main() {
	cfg := setting.Settings.Server
	gin.SetMode(cfg.RunMode)
	//启动web服务
	router := routers.NewRouter()
	srv := http.Server{
		Addr:    cfg.HttpHost + ":" + cfg.HttpPort,
		Handler: router,
	}
	fmt.Println("web: " + srv.Addr)
	fmt.Println("web: " + cfg.RunMode)
	go func() {
		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("listen: %s\n", err)
		}
	}()
	// 等待中断信号以优雅地关闭服务器（设置 5 秒的超时时间）
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
	//启动定时任务
	jobHandler(runJob)
	//退出信号等待
	<-quit
	//关闭web服务
	ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
	defer cancel()
	if err := srv.Shutdown(ctx); err != nil {
		log.Fatal("Server Shutdown:", err)
	}
	//发送飞书通知
	feiShuNotify()
	//通知任务退出,等待当前所有任务都结束
	waitForCompletion(runJob)
	log.Println("Shutting down server...")
}

func setupFlag() error {
	flag.IntVar(&runJob, "job", 0, "是否执行定时任务")
	flag.Parse()
	return nil
}

// 初始化配置
func setupSettings() error {
	//test
	cfg, err := setting.NewSetting("./conf/config.dev.yaml")
	if err != nil {
		return err
	}
	return cfg.ReadConf(&setting.Settings)
}

// 初始化日志服务
func setupLogger() error {
	return logging.InitLog(setting.Settings.Log)
}

// 初始化
func setupDBEngine() error {
	return dao.InitDBEngine(setting.Settings.Database)
}

// 初始化redis
func setupRDB() error {
	return dao.InitRDB(setting.Settings.Redis)
}

// 执行任务
func jobHandler(run int) {
	if run != 0 {
		fmt.Println("===>执行定时任务<===")
		handler.StartCronJobs()
	}
}

// 任务退出的时候飞书通知
func feiShuNotify() {
	notify := feishu.NewFeiShu(feishu.DEMO)
	notify.BaseNotify("cron job已退出,检查是否出问题")
}

// 等待所有任务完成
func waitForCompletion(runJob int) {
	if runJob != 0 {
		handler.WaitAllJobDone()
	}
}
