package app

import (
	"context"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
	"github.com/tidbcloud/AgentTeam/internal/store/access"
	"github.com/tidbcloud/AgentTeam/internal/store/agent"
	"github.com/tidbcloud/AgentTeam/internal/store/message"
)

func (store *Store) LoadAuthorizedHumanChannelAccess(ctx context.Context, queryer interface {
	QueryRow(context.Context, string, ...any) coredb.Row
}, userID string, workspaceID string, channelID string, action access.HumanAction) (access.HumanChannelAccess, error) {
	return store.loadAuthorizedHumanChannelAccess(ctx, queryer, userID, workspaceID, channelID, action)
}

func (store *Store) LoadAuthorizedHumanDMAccess(ctx context.Context, queryer interface {
	QueryRow(context.Context, string, ...any) coredb.Row
}, userID string, workspaceID string, dmThreadID string, action access.HumanAction) (access.HumanDMAccess, error) {
	return store.loadAuthorizedHumanDMAccess(ctx, queryer, userID, workspaceID, dmThreadID, action)
}

func (store *Store) LoadAuthorizedHumanThreadAccess(ctx context.Context, queryer interface {
	QueryRow(context.Context, string, ...any) coredb.Row
}, userID string, workspaceID string, threadChannelID string, action access.HumanAction) (access.HumanThreadAccess, error) {
	return store.loadAuthorizedHumanThreadAccess(ctx, queryer, userID, workspaceID, threadChannelID, action)
}

func (store *Store) RequireAgentOperation(ctx context.Context, userID string, workspaceID string, agentID string) (access.HumanAgentAccess, error) {
	return store.requireAgentOperation(ctx, userID, workspaceID, agentID)
}

func (store *Store) RequireAgentWorkspaceRead(ctx context.Context, userID string, workspaceID string, agentID string) (access.HumanAgentAccess, error) {
	return store.requireAgentWorkspaceRead(ctx, userID, workspaceID, agentID)
}

func (store *Store) RequireAgentReviewRead(ctx context.Context, userID string, workspaceID string, agentID string) (access.HumanAgentAccess, error) {
	return store.requireAgentReviewRead(ctx, userID, workspaceID, agentID)
}

func (store *Store) RequireMachineManagement(ctx context.Context, userID string, workspaceID string, machineID string) (access.HumanMachineAccess, error) {
	return store.requireMachineManagement(ctx, userID, workspaceID, machineID)
}

func (store *Store) RequireChannelInvite(ctx context.Context, userID string, workspaceID string, channelID string) (access.HumanChannelAccess, error) {
	return store.requireChannelInvite(ctx, userID, workspaceID, channelID)
}

func (store *Store) ResolveAuthorizedHumanMessageTarget(ctx context.Context, userID string, workspaceID string, channelID string) (access.HumanWorkspaceMember, message.ThreadAccess, error) {
	return store.resolveAuthorizedHumanMessageTarget(ctx, userID, workspaceID, channelID, channelReadAction, dmReadAction, threadReadAction)
}

func (store *Store) AgentViewByID(ctx context.Context, queryer interface {
	QueryRow(context.Context, string, ...any) coredb.Row
}, workspaceID string, agentID string) (agent.AgentView, error) {
	return store.agentViewByID(ctx, queryer, workspaceID, agentID)
}
