package knowledgeqa

import (
	"context"
	"time"

	knowledgeqastore "github.com/tidbcloud/AgentTeam/internal/store/knowledgeqa"
)

type sharingStore struct {
	store *knowledgeqastore.Store
}

func NewSharingService(store *knowledgeqastore.Store) SharingService {
	return &sharingStore{store: store}
}

func (service *sharingStore) CreateShare(
	ctx context.Context,
	workspaceID string,
	ownerUserID string,
	sessionID string,
	turnID string,
	now time.Time,
) (Share, error) {
	share, err := service.store.CreateShare(ctx, workspaceID, ownerUserID, sessionID, turnID, now)
	return shareFromStore(share), conversationStoreError(err)
}

func (service *sharingStore) OpenShare(
	ctx context.Context,
	recipientUserID string,
	token string,
	now time.Time,
) (Share, error) {
	share, err := service.store.OpenShare(ctx, recipientUserID, token, now)
	return shareFromStore(share), conversationStoreError(err)
}

func (service *sharingStore) LoadReceivedShare(
	ctx context.Context,
	recipientUserID string,
	shareID string,
	now time.Time,
) (Share, error) {
	share, err := service.store.LoadReceivedShare(ctx, recipientUserID, shareID, now)
	return shareFromStore(share), conversationStoreError(err)
}

func (service *sharingStore) LoadReceivedShareCitation(
	ctx context.Context,
	recipientUserID string,
	shareID string,
	evidenceID string,
) (ShareCitation, error) {
	shared, err := service.store.LoadReceivedShareCitation(ctx, recipientUserID, shareID, evidenceID)
	return shareCitationFromStore(shared), conversationStoreError(err)
}

func (service *sharingStore) ListReceivedShares(
	ctx context.Context,
	recipientUserID string,
	limit int,
) ([]Share, error) {
	shares, err := service.store.ListReceivedShares(ctx, recipientUserID, limit)
	if err != nil {
		return nil, conversationStoreError(err)
	}
	result := make([]Share, 0, len(shares))
	for _, share := range shares {
		result = append(result, shareFromStore(share))
	}
	return result, nil
}

func shareFromStore(share knowledgeqastore.Share) Share {
	return Share{
		ID:               share.ID,
		OwnerDisplayName: share.OwnerDisplayName,
		Question:         share.Question,
		Answer:           share.Answer,
		Token:            share.Token,
		CreatedAt:        share.CreatedAt,
		LastOpenedAt:     share.LastOpenedAt,
	}
}

func shareCitationFromStore(shared knowledgeqastore.ShareCitation) ShareCitation {
	return ShareCitation{
		ShareID: shared.ShareID, EvidenceID: shared.EvidenceID,
		SourceWorkspaceID:    shared.SourceWorkspaceID,
		SourceOrganizationID: shared.SourceOrganizationID,
		SourceTurnID:         shared.SourceTurnID,
		Citation: Citation{
			CitationKind:    shared.Citation.CitationKind,
			KnowledgeBaseID: shared.Citation.KnowledgeBaseID,
			SourceID:        shared.Citation.SourceID, RootKind: shared.Citation.RootKind,
			RepoRole: shared.Citation.RepoRole, Revision: shared.Citation.Revision,
			ResolvedRef:     shared.Citation.ResolvedRef,
			ResolvedRefKind: shared.Citation.ResolvedRefKind,
			Path:            shared.Citation.Path, LineStart: shared.Citation.LineStart,
			LineEnd: shared.Citation.LineEnd, URL: shared.Citation.URL,
			Title: shared.Citation.Title, Snippet: shared.Citation.Snippet,
			FetchedAt: shared.Citation.FetchedAt,
		},
	}
}
