// Package service contains functionality that is common to all services.
package service

import (
	"context"

	"github.com/microcosm-cc/bluemonday"
	"github.com/tidbcloud/internal-portal/core-portal/auth"
)

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

// OperationsService is the common interface for our services
type OperationsService interface {
	CurrentUser(context.Context) *auth.User
	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) *auth.User {
	u, err := auth.GetUserFromContext(ctx)
	if err != nil {
		panic("expected user claim")
	}
	return u
}
