package oauth2

import (
	"github.com/gin-gonic/gin"

	oauth2_svc "github.com/tidbcloud/auth-server/internal/service/oauth2"
)

type Oauth2Controller interface {
	// Public Endpoint
	// Device get user_code, device_code and verification_uri by client_id
	DeviceAuthorizationEndpoint(c *gin.Context)
	// OAuth2 token endpoint, Shoud support the following grant types:
	// 	- Device Code Grant
	// 	- Refresh Token Grant
	// 	- Authorization Code Grant
	// Return the access_token and refresh_token
	TokenEndpoint(c *gin.Context)
	// OAuth2 revoke endpoint
	RevokeEndpoint(c *gin.Context)

	// Private Endpoint for tidbcloud console, user must login first
	// Check if user_code is valid, and return the grant request details
	InnerDeviceCodeCheckEndpoint(c *gin.Context)
	// User approve/deny the grant request
	InnerDeviceCodeConfirmationEndpoint(c *gin.Context)
	// Check if authorization request is valid
	InnerAuthorizationCodeCheckEndpoint(c *gin.Context)
	// User approve the authorization request
	InnerAuthorizationCodeConfirmationEndpoint(c *gin.Context)

	//// Tidbcloud console  quer token request
	//InnerQueryTokenEndpoint(c *gin.Context)

	// get user last access token
	InnerGetUserLastTokenEndpoint(c *gin.Context)
	// Tidbcloud console quer user  authorized applications request
	InnerQueryUserAuthorizedApplications(c *gin.Context)
	// Tidbcloud console   user  revoke token
	ConsoleRevokeEndpoint(c *gin.Context)
	// get userinfo by access token
	GetUserInfoEndpoint(c *gin.Context)
	GetAccessTokenInfoEndpoint(c *gin.Context)

	// Create application
	InnerCreateApplications(c *gin.Context)
}

type Oauth2ControllerImpl struct {
	oauth2Svc oauth2_svc.Oauth2Service
}

func NewOauth2Controller(oauth2Svc oauth2_svc.Oauth2Service) Oauth2Controller {
	return &Oauth2ControllerImpl{
		oauth2Svc: oauth2Svc,
	}
}
