package app

import (
	"context"
	"errors"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
	"github.com/tidbcloud/AgentTeam/internal/store/storeerr"
)

type ProviderWatchActor = ServiceEventActor
type providerWatchPrincipal = serviceEventPrincipal

func providerWatchActorPrincipalMemberID(actor ProviderWatchActor) string {
	return serviceEventActorPrincipalMemberID(actor)
}

func (store *Store) requireProviderWatchActorAuthorization(ctx context.Context, queryer coredb.QueryExecer, workspaceID string, actor ProviderWatchActor, installationID string, requiredScopes []string) error {
	return requireServiceEventActorAuthorization(ctx, queryer, workspaceID, actor, installationID, requiredScopes)
}

func providerWatchActorPrincipal(ctx context.Context, queryer coredb.QueryRower, workspaceID string, actor ProviderWatchActor) (providerWatchPrincipal, error) {
	return serviceEventActorPrincipal(ctx, queryer, workspaceID, actor)
}

func requireProviderWatchActorOwnsWatch(ctx context.Context, queryer coredb.QueryRower, workspaceID string, actor ProviderWatchActor, watch ServiceEventSubscriptionRecord) error {
	err := requireServiceEventActorOwnsSubscription(ctx, queryer, workspaceID, actor, watch)
	if err != nil && errors.Is(err, storeerr.ErrNotFound) {
		return storeerr.NotFound("watch_not_found")
	}
	return err
}

func providerWatchPrincipalMemberID(ctx context.Context, queryer coredb.QueryRower, workspaceID string, actor ProviderWatchActor) (string, error) {
	return serviceEventPrincipalMemberID(ctx, queryer, workspaceID, actor)
}

func providerWatchPrincipalMemberIDForTarget(ctx context.Context, queryer coredb.QueryRower, workspaceID string, actor ProviderWatchActor, target ProviderWatchTarget) (string, error) {
	return serviceEventPrincipalMemberIDForTarget(ctx, queryer, workspaceID, actor, target)
}

func providerWatchAgentOwnerMemberID(ctx context.Context, queryer coredb.QueryRower, workspaceID string, agentID string) (string, bool, error) {
	return serviceEventAgentOwnerMemberID(ctx, queryer, workspaceID, agentID)
}

func providerWatchAgentOwnerUserID(ctx context.Context, queryer coredb.QueryRower, workspaceID string, agentID string) (string, bool, error) {
	return serviceEventAgentOwnerUserID(ctx, queryer, workspaceID, agentID)
}

func providerWatchHumanUserIDForMember(ctx context.Context, queryer coredb.QueryRower, memberID string) (string, bool, error) {
	return serviceEventHumanUserIDForMember(ctx, queryer, memberID)
}

func validateProviderWatchActor(actor ProviderWatchActor) error {
	return validateServiceEventActor(actor)
}
