package itoken

import (
	"net/http"

	ctrl "github.com/tidbcloud/devops/pkg/controller"
	itksvcapi "github.com/tidbcloud/devops/pkg/service/itoken/api"

	"github.com/gin-gonic/gin"
	"go.uber.org/dig"
)

type ControllerParam struct {
	dig.In

	Service itksvcapi.InternalTokenServiceAPI
}

type Controller struct {
	svc itksvcapi.InternalTokenServiceAPI
}

func NewController(p ControllerParam) ctrl.Controller {
	return &Controller{
		svc: p.Service,
	}
}

func (c *Controller) Name() string {
	return "InternalTokenController"
}

func (c *Controller) RegisterAPI(suite *ctrl.Suite) error {
	internalRouter := suite.InternalRouter
	group := internalRouter.Group("/itoken")
	{
		group.GET("/.well-known/jwks.json", c.GetWellKnownJWKS)
	}

	return nil
}

// GetWellKnownJWKS
//
//	@Id				InternalTokenControllerGetWellKnownJWKS
//	@Description	get jwks in standard format for token verification
//	@Tags			InternalTokenController
//	@Produce		json
//	@Success		200	{object}	itoken.JWKSet
//	@Router			/api/v1/devops-internal/itoken/.well-known/jwks.json [get]
func (c *Controller) GetWellKnownJWKS(ctx *gin.Context) {
	jwks, err := c.svc.GetJWKS(ctx)
	if err != nil {
		ctrl.Fail(ctx, err)
		return
	}

	ctx.JSON(http.StatusOK, jwks)
}
