package pkg

import (
	"context"
	"github.com/microcosm-cc/bluemonday"
	"github.com/tidbcloud/debug_portal/auth"
	"github.com/tidbcloud/debug_portal/config"
	"github.com/tidbcloud/debug_portal/db/tenant"
	"github.com/tidbcloud/debug_portal/idl/pbgen/debug_portal"
	"github.com/tidbcloud/debug_portal/model"
	"github.com/tidbcloud/debug_portal/session"
)

type OperationsService interface {
	CurrentUser(context.Context) *tenant.User
	SanitizerPolicy() *bluemonday.Policy
}

// OperationsServiceState contains the service state
type OperationsServiceState struct {
	sanitizerPolicy *bluemonday.Policy
}

// New constructs an OperationsService
func New() *OperationsServiceState {
	return &OperationsServiceState{
		sanitizerPolicy: bluemonday.UGCPolicy(),
	}
}

func (s *OperationsServiceState) SanitizerPolicy() *bluemonday.Policy {
	return s.sanitizerPolicy
}

// CurrentUser gets the user from the request.
// This function panics if there is no user in the db for the email or no email claim in the context.
func (s *OperationsServiceState) CurrentUser(ctx context.Context) *tenant.User {
	u, err := auth.GetUserFromContext(ctx)
	if err != nil {
		panic("expected user claim")
	}
	return u
}

type debugPortalService struct {
	debug_portal.UnimplementedCentralDebugPortalServiceServer
	OperationsService
	model model.Model
	//topsqlModel    topsqlmodel.TopSQLModel
	config         *config.DebugPortalConfig
	oAuthClient    *session.OAuthClient
	sessionManager *session.SessionManager
}
