package server

import (
	"flag"
	"gadmin/config"
	"gadmin/internal/admin/data"
	"gadmin/internal/admin/gm_services"
	"gadmin/internal/admin/ws"
	"os"
	"os/signal"
	"syscall"

	"github.com/sirupsen/logrus"
)

func Start() {
	cfgFile := ".env"
	if config.SysType == "windows" {
		// envFilename = "local.env"
		// go run main.go -c local67.env
		flag.StringVar(&cfgFile, "c", "local.env", "配置环境")
		flag.Parse()
	}

	// 初始化日志，建立与数据库 redis nats etcd等的连接
	config.Init(cfgFile)
	// 兑换码兑换物品处理 world->nats->gadmin
	//gm_services.HandleGMSubscribe(config.GmNats.GetConn())

	// 加载JSON文件
	//jsonPath := path.Join(os.Getenv("JSON_PATH"), os.Getenv("JSON_VERSION"))
	//if err := gmdata.LoadGraveJson(jsonPath); err != nil {
	//	logrus.Errorf("gmdata.Load err: %v", err)
	//	return
	//}

	// web页面发送邮件 web -> gadmin-> nats -> world
	//gm_services.EmailCron()

	// 接收从word收到的消息推，准备发送给WEB前端
	//go gm_services.ListenRespMsg()

	// web前端和gadmin建立websocket连接 收发消息
	go ws.NotifyBoardCast()

	// 网页服务
	go func() {
		logrus.Infof("服务端口 [%v]", os.Getenv("ADMIN_SERVER_PORT"))
		if err := NewEngine().Run(os.Getenv("ADMIN_SERVER_PORT")); err != nil {
			logrus.Panicf("服务启动失败：%v", err)
		}
	}()

	// 定时发送邮件 和 广播
	//cronStart()

	after()
}

func after() {
	quit := make(chan os.Signal)
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)

	quantity := <-quit
	logrus.Infoln("收到中断信号:", quantity.String())

	// 保存邮件
	gm_services.SaveEmailDb()

	// 保存通知
	if err := data.SaveToBak(); err != nil {
		logrus.Warnln("SaveToBak err:", err.Error())
	}

	config.CloseGrpcConn()

	logrus.Infoln("已退出")
}
