package operation

import (
	ctrl "github.com/tidbcloud/devops/pkg/controller"
	coresvccli "github.com/tidbcloud/devops/pkg/infra/clients/coresvccli"
	opsvc "github.com/tidbcloud/devops/pkg/service/operation"

	"go.uber.org/dig"
)

type ControllerParam struct {
	dig.In

	OperationService opsvc.OperationServiceAPI
	CoreSvcCli       *coresvccli.CoreSvcCli
}

type OperationController struct {
	opSvc      opsvc.OperationServiceAPI
	coreSvcCli *coresvccli.CoreSvcCli
}

func NewOperationController(p ControllerParam) ctrl.Controller {
	return &OperationController{
		opSvc:      p.OperationService,
		coreSvcCli: p.CoreSvcCli,
	}
}

func (c *OperationController) RegisterAPI(suite *ctrl.Suite) error {
	r := suite.Router
	group := r.Group("/operation")
	{
		group.GET("/instances", c.ListInstances)
		group.POST("/instances/preview", c.PreviewInstance)
		group.POST("/instances", c.CreateInstance)
		group.GET("/instances/:instance_id", c.GetInstance)
		group.PATCH("/instances/:instance_id", c.UpdateInstance)
		group.POST("/instances/:instance_id/submit", c.SubmitInstance)
		group.POST("/instances/:instance_id/cancel", c.CancelInstance)
		group.POST("/instances/:instance_id/actions/:action_order/start", c.StartInstanceAction)
		group.POST("/instances/:instance_id/actions/:action_order/finish", c.FinishInstanceAction)

		group.GET("/operations", c.ListOperations)
		group.GET("/operations/categories", c.ListOperationCategories)
		group.GET("/operations/:operation_name", c.GetOperation)

		group.GET("/actions", c.ListActions)
		group.GET("/actions/:action_name", c.GetAction)
	}

	return nil
}

func (c *OperationController) Name() string {
	return "OperationController"
}
