package main

import (
	"fmt"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/context"
	beeorm "github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
	"gitlab.fjmaimaimai.com/mmm-go/gocomm/common"
	"gitlab.fjmaimaimai.com/mmm-go/gocomm/config"
	"gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/log"
	"gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/redis"
	"gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/websocket"
	"opp/controllers"
	"opp/internal/utils"
	_ "opp/routers"
	"opp/services/contrab"
	"os"
	"strings"
	"time"
)

func init() {
	time.Local = time.FixedZone("CST", 3600*8)
	log.InitLog(config.Logger{
		Filename: beego.AppConfig.String("aliyun_logs_access"),
		Level:    fmt.Sprintf("%v", utils.ResolveLogLevel(beego.AppConfig.String("log_level"))),
	})
	//TODO:kafka log配置
	//log.InitKafkaLogger(log.KafkaConfig{
	//	Topic: "ability",
	//	Addrs: []string{"127.0.0.1:9092"},
	//	Level: 6,
	//})
	redisSource := fmt.Sprintf("%v:%v", beego.AppConfig.String("redis_add"), beego.AppConfig.String("redis_add_port"))
	err := redis.InitWithDb(100, redisSource, beego.AppConfig.String("redis_auth"), "0")
	log.Info(fmt.Sprintf("init redis:%v", redisSource))
	if err != nil {
		log.Fatal("connect to redis error address:", beego.AppConfig.String("redis_add_port"), beego.AppConfig.String("redis_auth"), err)
		panic(err)
	}
	dataSource := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?loc=Asia%%2FShanghai&charset=utf8mb4",
		beego.AppConfig.String("mysql_user"),
		beego.AppConfig.String("mysql_password"),
		beego.AppConfig.String("mysql_host"),
		beego.AppConfig.String("mysql_port"),
		beego.AppConfig.String("mysql_db_name"),
	)
	//log.Info(fmt.Sprintf("init mysql:%v", dataSource))
	NewBeeormEngine(config.Mysql{
		//AliasName:  "default",
		DataSource: dataSource,
		MaxIdle:    100,
		MaxOpen:    100,
	})

	//TODO:邮件服务配置
	common.InitMailService(&common.MailConfig{
		//Host:"smtp.qq.com",
		//Port:465,
		//From:"785410885@qq.com",
		//Password:"ibfduqhfmgypbffe", //授权码
		//IsUseSsl:true,
	})
	//im.InitImClient(beego.AppConfig.String("net_im_base_url"), beego.AppConfig.String("net_im_app_key"), beego.AppConfig.String("net_im_app_secret"))
	websocket.InitWebsocketConnmgrs(10)

	//log.Info(fmt.Sprintf("env MYSQL_USER:%v", os.Getenv("MYSQL_USER")))
	//log.Info(fmt.Sprintf("env MYSQL_PASSWORD:%v", os.Getenv("MYSQL_PASSWORD")))
	//log.Info(fmt.Sprintf("env MYSQL_HOST:%v", os.Getenv("MYSQL_HOST")))
	//log.Info(fmt.Sprintf("env MYSQL_PORT:%v", os.Getenv("MYSQL_PORT")))
	log.Info(fmt.Sprintf("env MYSQL_DB_NAME:%v", os.Getenv("MYSQL_DB_NAME")))
	log.Info(fmt.Sprintf("env LOG_LEVEL:%v", os.Getenv("LOG_LEVEL")))
	log.Info(fmt.Sprintf("env aliyun_logs_access:%v", os.Getenv("aliyun_logs_access")))
	log.Info(fmt.Sprintf("env REDIS_HOST:%v", os.Getenv("REDIS_HOST")))
	log.Info(fmt.Sprintf("env REDIS_PORT:%v", os.Getenv("REDIS_PORT")))
	log.Info(fmt.Sprintf("env aliyun_file_access:%v", os.Getenv("aliyun_file_access")))

	//mime.AddExtensionType(".mp3","audio/mpeg")
}

func main() {
	defer func() {
		log.Info("app on stop!")
	}()
	log.Info("app on start!")
	log.Info("Beego Run Mode:", beego.BConfig.RunMode)

	//StaticFileAllowCors()

	beego.InsertFilter("file/opp/*", beego.BeforeStatic, FilterBeforeStatic)

	//https
	beego.BConfig.Listen.EnableHTTPS = true
	beego.BConfig.Listen.Graceful = true
	beego.BConfig.Listen.HTTPSPort = 443
	beego.BConfig.Listen.HTTPSCertFile = "conf/_.fjmaimaimai.com_bundle.crt"
	beego.BConfig.Listen.HTTPSKeyFile = "conf/_.fjmaimaimai.com.key"
	contrab.Run()

	beego.Run()
}

var FilterBeforeStatic = func(ctx *context.Context) {
	if strings.HasSuffix(ctx.Request.RequestURI, ".mp3") {
		//If-Modified-Since
		//ctx.Request.Header.Add("If-Modified-Since","")
		ctx.ResponseWriter.Header().Add("Content-Type", "audio/mpeg")
	}
}

func StaticFileAllowCors() {
	beego.InsertFilter("/file/opp/*", beego.BeforeRouter, controllers.AllowOption)
}

func NewBeeormEngine(conf config.Mysql) {
	aliasName := "default"
	if len(conf.AliasName) > 0 {
		aliasName = conf.AliasName
	}
	err := beeorm.RegisterDataBase(aliasName, "mysql", conf.DataSource)
	if err != nil {
		log.Error(err)
	} else {
		//log.Debug("open db address:",conf.DataSource)
	}
	beeorm.SetMaxIdleConns(aliasName, conf.MaxIdle)
	beeorm.SetMaxOpenConns(aliasName, conf.MaxOpen)
	//orm.DefaultTimeLoc = time.Local
	//orm.Debug = true
}