package testkit

import (
	"context"

	"github.com/tidbcloud/AgentTeam/internal/core/domain"
	"github.com/tidbcloud/AgentTeam/internal/store/agent"
	"github.com/tidbcloud/AgentTeam/internal/store/identity"
	"github.com/tidbcloud/AgentTeam/internal/store/message"
	"github.com/tidbcloud/AgentTeam/internal/store/message/testdelivery"
)

// AuthenticateSession is a test fixture helper backed by the identity store.
func (root *Store) AuthenticateSession(ctx context.Context, token string) (identity.AuthenticatedUser, error) {
	return root.Identity().AuthenticateSession(ctx, token)
}

// JoinChannelForUser is a test fixture helper for channel membership setup.
func (root *Store) JoinChannelForUser(ctx context.Context, userID string, workspaceID string, channelID string) error {
	return root.Channel().JoinChannelForUser(ctx, userID, workspaceID, channelID)
}

// SendAgentMessage is a test fixture helper for daemon-authored thread messages.
func (root *Store) SendAgentMessage(ctx context.Context, sender agent.AuthenticatedAgent, params message.SendMessageParams) (message.MessageDelivery, error) {
	return root.App().SendAgentThreadMessage(ctx, sender, params)
}

// SendMessageForUser is a compatibility fixture helper for user-authored
// messages routed through the owning app store.
func (root *Store) SendMessageForUser(ctx context.Context, user domain.User, workspaceID string, channelID string, content string, attachmentIDs []string) (message.AppMessage, message.MessageDelivery, error) {
	return root.App().SendMessageForUser(ctx, identity.User{
		ID:               user.ID,
		Email:            user.Email,
		Mobile:           user.Mobile,
		Name:             user.Name,
		DisplayName:      user.DisplayName,
		AvatarURL:        user.AvatarURL,
		IsAdmin:          user.IsAdmin,
		PasswordHash:     user.PasswordHash,
		EmailVerifiedAt:  user.EmailVerifiedAt,
		MobileVerifiedAt: user.MobileVerifiedAt,
		CreatedAt:        user.CreatedAt,
		UpdatedAt:        user.UpdatedAt,
	}, workspaceID, channelID, content, attachmentIDs)
}

// SendMessageForUserWithMetadata is a task-parity fixture helper backed by the
// owning app store.
func (root *Store) SendMessageForUserWithMetadata(ctx context.Context, user identity.User, workspaceID string, scopeID string, content string, attachmentIDs []string, metadata map[string]any) (message.AppMessage, message.MessageDelivery, error) {
	return root.App().SendMessageForUserWithMetadata(ctx, user, workspaceID, scopeID, content, attachmentIDs, metadata)
}

// ListMessagesForUser is a compatibility fixture helper for user-visible
// message pages routed through the owning app store.
func (root *Store) ListMessagesForUser(ctx context.Context, userID string, workspaceID string, channelID string, limit int, before *int64, after *int64) (message.AppMessagePage, error) {
	return root.App().ListMessagesForUser(ctx, userID, workspaceID, channelID, limit, before, after)
}

// ReceiveAgentMessages is a fixture helper that inspects persisted fanout payloads for routing assertions.
func (root *Store) ReceiveAgentMessages(ctx context.Context, authenticated agent.AuthenticatedAgent, limit int) ([]message.ReceiveMessage, error) {
	return testdelivery.ReceiveAgentMessagesFromFanout(ctx, root.DB, authenticated, limit)
}

// OpenReplyThreadForUser is a test fixture helper for reply-thread setup.
func (root *Store) OpenReplyThreadForUser(ctx context.Context, userID string, workspaceID string, channelID string, parentMessageID string) (message.ReplyThreadSummary, error) {
	return root.Message().OpenReplyThreadForUser(ctx, userID, workspaceID, channelID, parentMessageID)
}
