package main

import (
	_ "FollowUp_Notice/Nats"
	"FollowUp_Notice/conf"
	"FollowUp_Notice/controllers"
	"FollowUp_Notice/logs"
	_ "FollowUp_Notice/models/Account"
	_ "FollowUp_Notice/models/Illness"
	_ "FollowUp_Notice/models/Patient"
	_ "FollowUp_Notice/models/System"
	_ "FollowUp_Notice/models/Tag"
	_ "FollowUp_Notice/routers"
	"fmt"
	"github.com/beego/beego/v2/adapter/orm"
	orm2 "github.com/beego/beego/v2/client/orm"
	beego "github.com/beego/beego/v2/server/web"
	"github.com/beego/beego/v2/server/web/context"
	"github.com/beego/beego/v2/server/web/filter/cors"
	_ "github.com/go-sql-driver/mysql"
	"runtime"
	"strconv"
)

func init() {
	fmt.Println(runtime.GOOS)
	orm.RegisterDriver("mysql", orm.DRMySQL)
	//orm.RegisterDataBase("default", "mysql", "zdxq:7e5853d9178edfcc@tcp(47.108.133.234:3306)/zdxq?charset=utf8",100,200)
	orm.RegisterDataBase("default", "mysql",
		conf.MysqlServer_Username+":"+conf.MysqlServer_Password+"@tcp("+conf.MysqlServer_UrlPort+")/"+conf.MysqlServer_Database+"?charset=utf8mb4&loc=Local&parseTime=True",
		conf.MysqlServer_MaxIdleConnections, conf.MysqlServer_MaxOpenConnections)
	orm.RunSyncdb("default", false, false) // 创建数据库
	orm2.Debug = true
}

func main() {

	HTTPPort, _ := beego.AppConfig.String("HTTPPort")
	HTTPPort_int, _ := strconv.Atoi(HTTPPort)

	beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{
		// 允许访问所有源
		AllowAllOrigins: true,
		// 可选参数"GET", "POST", "PUT", "DELETE", "OPTIONS" (*为所有)
		AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
		// 指的是允许的Header的种类
		AllowHeaders: []string{"Origin", "Authorization", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type"},
		// 公开的HTTP标头列表
		ExposeHeaders: []string{"Content-Length", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type"},
		// 如果设置，则允许共享身份验证凭据，例如cookie
		AllowCredentials: true,
	}))

	appname, _ := beego.AppConfig.String("appname")

	beego.BConfig.AppName = appname              // 项目名
	beego.BConfig.ServerName = appname           //server  名称
	beego.BConfig.RunMode = "dev"                //  应用的运行模式
	beego.BConfig.Listen.HTTPPort = HTTPPort_int //监听端口  本地：8518  线上：8528
	beego.BConfig.WebConfig.AutoRender = false
	beego.BConfig.RecoverPanic = true
	beego.BConfig.RecoverFunc = RecoverPanic

	go controllers.Cron_User()    // 用户账单统计
	go controllers.Cron_Patient() // 患者通知信息
	//go controllers.Cron_Patient_Notice() // 患者通知信息
	beego.Run()

}

func RecoverPanic(ctx *context.Context, config *beego.Config) {
	if err := recover(); err != nil {
		ctx.ResponseWriter.Header().Set("Access-Control-Allow-Origin", ctx.Request.Header.Get("Origin"))
		var stack []string
		for i := 1; ; i++ {
			_, file, line, ok := runtime.Caller(i)
			if !ok {
				break
			}
			logs.Error(fmt.Sprintf("%s:%d", file, line))
			stack = append(stack, fmt.Sprintln(fmt.Sprintf("%s:%d", file, line)))
		}
		//显示错误
		data := map[string]interface{}{
			"AppError": fmt.Sprintf("%v", err),
			"Code":     500,
			"Msg":      "请稍后重试!",
		}
		if conf.RunMode == "dev" {
			data["RequestMethod"] = ctx.Input.Method()
			data["RequestURL"] = ctx.Input.URI()
			data["RemoteAddr"] = ctx.Input.IP()
			data["Stack"] = stack
			data["GoVersion"] = runtime.Version()
		}
		_ = ctx.Output.JSON(data, true, true)
		//if ctx.Output.Status != 0 {
		//	ctx.ResponseWriter.WriteHeader(ctx.Output.Status)
		//} else {
		//	ctx.ResponseWriter.WriteHeader(500)
		//}
	}
}
