package controlplane

import (
	ctrl "github.com/tidbcloud/devops/pkg/controller"
	depsvcapi "github.com/tidbcloud/devops/pkg/service/controlplane/api"

	"go.uber.org/dig"
)

type ControllerParam struct {
	dig.In

	DeploymentService depsvcapi.DeploymentServiceAPI
}

type DeploymentController struct {
	depSvc depsvcapi.DeploymentServiceAPI
}

func NewDeploymentController(p ControllerParam) ctrl.Controller {
	return &DeploymentController{
		depSvc: p.DeploymentService,
	}
}

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

func (c *DeploymentController) RegisterAPI(suite *ctrl.Suite) error {
	r := suite.Router
	group := r.Group("/controlplane")
	{
		group.POST("/deployments", c.CreateDeployment)
		group.GET("/deployments", c.ListDeployments)
		group.GET("/deployments/:deployment_id", c.GetDeployment)
		group.POST("/deployments/:deployment_id/preview", c.StartPreview)
		group.POST("/deployments/:deployment_id/apply", c.StartApply)
		group.POST("/deployments/:deployment_id/retry", c.RetryApply)
		group.POST("/deployments/:deployment_id/cancel", c.Cancel)
	}

	ir := suite.InternalRouter
	irgroup := ir.Group("/controlplane")
	{
		irgroup.POST("/deployments/:deployment_id/preview/complete", c.OnPreviewComplete)
		irgroup.POST("/deployments/:deployment_id/apply/complete", c.OnApplyComplete)
	}

	return nil
}
