package debugportal

import (
	"context"

	"github.com/pingcap/dbaas/pkg/auth/debug"
	"github.com/pingcap/errcode"
	"github.com/tidbcloud/idl/pbgen/proto/central"
)

func (service *debugPortalService) GetOAuthConfig(_ context.Context, req *central.DebugPortalGetOAuthConfigReq) (*central.DebugPortalGetOAuthConfigResp, error) {
	url, err := service.oAuthClient.WithRedirectURL(req.RedirectUri).GenerateAuthURL()
	if err != nil {
		return nil, err
	}
	return &central.DebugPortalGetOAuthConfigResp{
		AuthUrl: url,
	}, nil
}

func (service *debugPortalService) ExchangeOAuthToken(context context.Context, req *central.DebugPortalExchangeOAuthTokenReq) (*central.DebugPortalExchangeOAuthTokenResp, error) {
	session, err := service.oAuthClient.WithRedirectURL(req.RedirectUri).Exchange(context, req.State, req.Code)
	if err != nil {
		return nil, err
	}
	token, err := service.sessionManager.NewSession(session)
	if err != nil {
		// NewSession failures must be an internal error
		return nil, errcode.NewInternalErr(err)
	}
	if req.SessionKeyAsCookie {
		_ = debug.GrpcSetCookie(context, token)
	}
	return &central.DebugPortalExchangeOAuthTokenResp{
		SessionKey: token,
	}, nil
}
