package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/infraboard/mcube/v2/ioc"
	"github.com/infraboard/mcube/v2/ioc/config/datasource"
	ioc_gin "github.com/infraboard/mcube/v2/ioc/config/gin"

	"github.com/infraboard/mcube/v2/ioc/server/cmd"

	"gorm.io/gorm"

	// 开启Health健康检查
	_ "github.com/infraboard/mcube/v2/ioc/apps/health/gin"
	// 开启Metric
	_ "github.com/infraboard/mcube/v2/ioc/apps/metric/gin"

	// 日志
	"github.com/infraboard/mcube/v2/ioc/config/log"
)

func main() {
	// 注册HTTP接口类
	ioc.Api().Registry(&ApiHandler{})

	// 开启配置文件读取配置
	// server 是一个特殊的对象，在ioc 提供的 服务器
	// server.DefaultConfig.ConfigFile.Enabled = true
	// server.DefaultConfig.ConfigFile.Paths = []string{"etc/application.toml"}

	// // 启动应用
	// err := server.Run(context.Background())
	// if err != nil {
	// 	panic(err)
	// }

	// 基于CLI启动
	cmd.Start()
	// 为程序添加子命令
	// cmd.Root.AddCommand()

}

type ApiHandler struct {
	// 继承自Ioc对象
	ioc.ObjectImpl

	// mysql db依赖
	db *gorm.DB
}

// 覆写对象的名称, 该名称名称会体现在API的路径前缀里面
// 比如: /simple/api/v1/module_a/db_stats
// 其中/simple/api/v1/module_a 就是对象API前缀, 命名规则如下:
//
// <service_name>/<path_prefix>/<object_version>/<object_name>
func (h *ApiHandler) Name() string {
	return "module_a"
}

// 初始化db属性, 从ioc的配置区域获取共用工具 gorm db对象
func (h *ApiHandler) Init() error {
	h.db = datasource.DB()

	// 进行业务暴露, router 通过ioc
	router := ioc_gin.RootRouter()
	router.GET("/db_stats", h.GetDbStats)
	return nil
}

// 业务功能
func (h *ApiHandler) GetDbStats(ctx *gin.Context) {
	// 使用L() 获取日志对象, 进行日志记录
	log.Sub("api handler").Info().Msg("GetDbStats")
	db, _ := h.db.DB()

	ctx.JSON(http.StatusOK, gin.H{
		"data": db.Stats(),
	})
}
