package api

import (
	"easyvqd/internal/core/host"
	"easyvqd/internal/core/media"
	"easyvqd/internal/core/vqd"
	"easyvqd/internal/core/vqd/store/audioencodedb"
	"easyvqd/internal/core/vqdtask"
	"net/http"

	"easyvqd/domain/uniqueid"
	"easyvqd/domain/uniqueid/store/uniqueiddb"
	"easyvqd/domain/version/versionapi"
	"easyvqd/internal/conf"

	"git.lnton.com/lnton/pkg/orm"
	"git.lnton.com/lnton/pkg/web"
	"github.com/gin-gonic/gin"
	"github.com/google/wire"
	"gorm.io/gorm"
)

var (
	ProviderVersionSet = wire.NewSet(versionapi.NewVersionCore)
	ProviderSet        = wire.NewSet(
		wire.Struct(new(Usecase), "*"),
		NewHTTPHandler,
		NewVqdTaskCore,
		NewVqdTaskAPI,
		versionapi.New,
		host.NewCore,
		media.NewCore,
	)
)

type Usecase struct {
	Conf        *conf.Bootstrap
	DB          *gorm.DB
	Version     versionapi.API
	VqdTaskCore *vqd.Core
	VqdTaskAPI  VqdTaskAPI
	HostCore    *host.Core
	MediaCore   *media.Core
	VqdSdkCore  *vqdtask.Core
}

// NewHTTPHandler 生成Gin框架路由内容
func NewHTTPHandler(uc *Usecase) http.Handler {
	cfg := uc.Conf
	// 检查是否设置了 JWT 密钥，如果未设置，则生成一个长度为 32 的随机字符串作为密钥
	if cfg.Server.HTTP.JwtSecret == "" {
		uc.Conf.Server.HTTP.JwtSecret = orm.GenerateRandomString(32)
	}
	// 如果不处于调试模式，将 Gin 设置为发布模式
	if !uc.Conf.Debug {
		gin.SetMode(gin.ReleaseMode)
	}
	g := gin.New()
	// 处理未找到路由的情况，返回 JSON 格式的 404 错误信息

	// 如果启用了 Pprof，设置 Pprof 监控
	if cfg.Server.HTTP.PProf.Enabled {
		web.SetupPProf(g, &cfg.Server.HTTP.PProf.AccessIps)
	}

	setupRouter(g, uc)
	RegisterPluginGRPC(uc.HostCore, uc.MediaCore, uc)
	// 这个一定要在最后执行，避免在迁移过程中发生panic导致迁移一半
	uc.Version.RecordVersion()
	return g
}

// NewUniqueID 生成唯一 id
func NewUniqueID(db *gorm.DB) uniqueid.Core {
	store := uniqueiddb.NewDB(db).AutoMigrate(orm.GetEnabledAutoMigrate())
	return uniqueid.NewCore(store, 6)
}

// NewVqdTaskCore 推流任务
func NewVqdTaskCore(db *gorm.DB) *vqd.Core {
	store := audioencodedb.NewDB(db).AutoMigrate(orm.EnabledAutoMigrate)
	return vqd.NewCore(store)
}
