package release

import (
	ctrl "github.com/tidbcloud/devops/pkg/controller"
	relsvcapi "github.com/tidbcloud/devops/pkg/service/release/api"

	"go.uber.org/dig"
)

type ControllerParam struct {
	dig.In

	Service relsvcapi.ServiceAPI
}

// ReleaseController provide the api to manage releases.
type ReleaseController struct {
	relSvc relsvcapi.ReleaseServiceAPI
	chgSvc relsvcapi.ChangeServiceAPI
}

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

func NewReleaseController(p ControllerParam) ctrl.Controller {
	return &ReleaseController{
		relSvc: p.Service,
		chgSvc: p.Service,
	}
}

func (c *ReleaseController) RegisterAPI(suite *ctrl.Suite) error {
	r := suite.Router
	group := r.Group("/release")
	{
		group.GET("/releases", c.ListReleases)
		group.GET("/releases/:release_id", c.GetRelease)
		group.GET("/releases/:release_id/changes", c.ListChangesOfRelease)
		group.GET("/releases/:release_id/tickets", c.ListChangesOfRelease)

		group.GET("/changes/default", c.DefaultChange)
		group.POST("/changes", c.CreateChange)
		group.GET("/changes/:change_id", c.GetChange)
		group.PUT("/changes/:change_id", c.UpdateChange)
		group.POST("/changes/:change_id/submit", c.SubmitChange)
		group.POST("/changes/:change_id/cancel", c.CancelChange)
		group.POST("/changes/:change_id/close", c.CloseChange)

		group.POST("/changes/:change_id/deployments/:deployment_order/deploy", c.ExecuteDeployment)
		group.POST("/changes/:change_id/deployments/:deployment_order/verify", c.VerifyDeployment)
		group.GET("/changes/:change_id/deployments/:deployment_order/ready", c.IsDeploymentReady)

		group.GET("/tickets", c.ListTickets)
		group.GET("/tickets/:ticket_name", c.GetTicket)
		group.PUT("/tickets/:ticket_name", c.UpdateTicket)
		group.POST("/tickets/:ticket_name/sync_async", c.SyncTicketAsync)
	}

	ir := suite.InternalRouter
	irgroup := ir.Group("/release")
	{
		irgroup.POST("/releases/sync", c.SyncReleaseManually)
	}

	return nil
}
