// Package serviceaccount contains browser-facing workspace Service Account
// management routes.
package serviceaccount

import (
	"context"
	"time"

	"github.com/tidbcloud/AgentTeam/internal/api"
	serviceaccountservice "github.com/tidbcloud/AgentTeam/internal/service/serviceaccount"
	"github.com/tidbcloud/AgentTeam/internal/store/app"
	serviceaccountstore "github.com/tidbcloud/AgentTeam/internal/store/serviceaccount"
)

type Service interface {
	SubmitWorkspaceCreateRequestAndReconcile(context.Context, serviceaccountservice.SubmitWorkspaceCreateRequest) (serviceaccountservice.WorkspaceCreateRequestResult, error)
	SettlePrivilegedWorkspaceCreateRequest(context.Context, string, string, time.Time) (serviceaccountservice.WorkspaceCreateRequestResult, bool, error)
	ListAccountsForUser(context.Context, string, string, string, string, int) ([]serviceaccountservice.AccountAccess, error)
	GetAccountForUser(context.Context, string, string, string) (serviceaccountservice.AccountAccess, error)
	DeleteWorkspaceAccountForUser(context.Context, string, string, string, int64, time.Time) (serviceaccountstore.Account, error)
	ListManagersForUser(context.Context, string, string, string) ([]serviceaccountstore.ManagerAssignment, error)
	AddManagerForUser(context.Context, string, string, string, string, time.Time) (serviceaccountstore.ManagerAssignment, error)
	RemoveManagerForUser(context.Context, string, string, string, string, int64, time.Time) (serviceaccountstore.ManagerAssignment, error)
	UpdateWorkspaceAccountAvatarForUser(context.Context, string, string, string, string, time.Time) (serviceaccountstore.Account, error)
	ListCreateRequestsForUser(context.Context, string, string, string, int) ([]serviceaccountstore.CreateRequest, error)
	GetCreateRequestForUser(context.Context, string, string, string) (serviceaccountservice.CreateRequestDetail, error)
}

type PendingRequestProjector interface {
	ProjectPendingRequest(context.Context, serviceaccountservice.WorkspaceCreateRequestResult) ([]app.AppNotificationResult, error)
}

type Dependencies struct {
	SessionAuth               api.SessionAuthenticator
	WorkspaceStore            api.WorkspaceResolver
	Service                   Service
	PendingRequestProjector   PendingRequestProjector
	EmailVerificationRequired bool
}
