package main

import (
	"context"
	"flag"

	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/contrib/static"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"github.com/tidbcloud/tiinf/transport/http/tigin"
	"go.uber.org/zap"

	"github.com/tidbcloud/aitestsuit/configs"
	"github.com/tidbcloud/aitestsuit/internal/controller"
	"github.com/tidbcloud/aitestsuit/internal/dao"
	"github.com/tidbcloud/aitestsuit/internal/entity"
	"github.com/tidbcloud/aitestsuit/internal/tasks"
	"github.com/tidbcloud/aitestsuit/third_party/aipowersvc"
	"github.com/tidbcloud/aitestsuit/third_party/dataapisvc"
	"github.com/tidbcloud/aitestsuit/third_party/openai"
)

var (
	configPath = flag.String("config", "/etc/dbaas/config.yaml", "DBaaS configuration file path")
)

// @BasePath /api/v1
func main() {
	flag.Parse()
	configs.SetConfigPath(*configPath)

	ctx := context.TODO()
	tilog.Info(ctx, "aitestsuit start")

	// Init db
	cfg := configs.GetConfig()
	if err := entity.InitDB(cfg, true); err != nil {
		tilog.Panic(ctx, "failed to init db", zap.Error(err))
		return
	}
	db := entity.GetDB()
	dao.InitDB(db)
	openai.InitGPT(cfg.ChatGPTToken)
	if err := dataapisvc.InitDataAPI(cfg.DataAPIAddr); err != nil {
		tilog.Panic(ctx, "failed to init dataapi", zap.Error(err))
	}
	if err := aipowersvc.InitAIPower(cfg.AIPowerAddr); err != nil {
		tilog.Panic(ctx, "failed to init aipower", zap.Error(err))
	}

	go tasks.StartWorker(ctx)

	// init service
	//accountSvc := account.NewAccountSvc(ctx, cfg)

	engine := tigin.Default()
	engine.GET("/healthz", tigin.Ping)
	engine.GET("/ping", tigin.Ping)
	engine.Use(static.Serve("/", static.LocalFile("./ui/dist/", true)))

	corsConfig := cors.DefaultConfig()
	corsConfig.AllowAllOrigins = true
	corsConfig.AddAllowHeaders("Authorization")
	engine.Use(cors.New(corsConfig))

	apiGroup := engine.Group("/api/v1")
	//apiGroup.Use(tigin.CheckUserAndPermission(accountSvc.GetAccountServiceClient()))
	{
		apiGroup.GET("/plans", controller.GetTestPlans)
		apiGroup.GET("/plan/:plan_id/cases", controller.GetTestCases)
		apiGroup.GET("/case/:id", controller.GetTestCase)
		apiGroup.GET("/prompt_templates", controller.GetPromptTemplates)
		apiGroup.POST("/prompt_template", controller.CreatePromptTemplate)
		apiGroup.PUT("/prompt_template/:id", controller.UpdatePromptTemplate)
		apiGroup.GET("/reports", controller.GetTestReports)
		apiGroup.GET("/report/:id", controller.GetTestReport)
		apiGroup.GET("/runs", controller.GetTestRuns)
		apiGroup.GET("/run/:id", controller.GetTestRun)
		apiGroup.GET("/stats", controller.GetTestStats)
		apiGroup.POST("/run", controller.CreateTestRun)
		apiGroup.POST("/task", controller.CreateTestTask)
		apiGroup.POST("/dataset", controller.CreateDataSet)
		apiGroup.POST("/plan", controller.CreateTestPlan)
		apiGroup.POST("/case", controller.CreateTestCase)
		apiGroup.PUT("/case", controller.UpdateTestCase)
		apiGroup.DELETE("/case/:id", controller.DeleteTestCase)
		apiGroup.POST("/ai_model", controller.CreateAIModel)
		apiGroup.PUT("/ai_model", controller.UpdateAIModel)
		apiGroup.GET("/ai_models", controller.GetAIModels)
		// aipower
		apiGroup.GET("/aipower/latest_prompt", controller.GetCurrentAIPowerPromptTemplate)
		apiGroup.GET("/aipower/prompts", controller.GetAIPowerPromptTemplates)
		apiGroup.POST("/aipower/prompts/release", controller.ReleaseAIPowerPromptTemplate)
	}

	engine.Run("0.0.0.0:11000") //nolint:errcheck
}
