package knowledgeqa

import (
	"github.com/tidbcloud/AgentTeam/internal/api/dto"
	"github.com/tidbcloud/AgentTeam/internal/knowledgeqa/protocol"
)

func toSessionDTO(session Session) dto.KnowledgeQASession {
	return dto.KnowledgeQASession{
		ID:               session.ID,
		ThreadChannelID:  session.ThreadChannelID,
		RootMessageID:    session.RootMessageID,
		Runtime:          "server_hosted",
		ManagedBy:        "organization",
		Model:            session.RequestedModel,
		ReasonLevel:      session.RequestedReasonLevel,
		WebSearchEnabled: session.WebSearchEnabled,
		KnowledgeBaseIDs: nonNilStrings(session.RequestedKnowledgeBaseIDs),
		SourceIDs:        nonNilStrings(session.RequestedSourceIDs),
		Status:           session.Status,
	}
}

func toTurnDTO(turn Turn) dto.KnowledgeQATurn {
	activities := make([]dto.KnowledgeQAActivity, 0, len(turn.Activities))
	for _, activity := range turn.Activities {
		activities = append(activities, toActivityDTO(activity))
	}
	return dto.KnowledgeQATurn{
		ID:                 turn.ID,
		SessionID:          turn.SessionID,
		UserMessageID:      turn.UserMessageID,
		AssistantMessageID: turn.AssistantMessageID,
		Question:           turn.Question,
		Model:              turn.RequestedModel,
		ReasonLevel:        turn.RequestedReasonLevel,
		WebSearchEnabled:   turn.WebSearchEnabled,
		Status:             turn.Status,
		ErrorCode:          turn.ErrorCode,
		DebugModelOutput:   turn.DebugModelOutput,
		Activities:         activities,
	}
}

func toActivityDTO(activity protocol.RuntimeActivity) dto.KnowledgeQAActivity {
	return dto.KnowledgeQAActivity{
		ID:             activity.ID,
		Sequence:       activity.Sequence,
		Kind:           activity.Kind,
		Status:         activity.Status,
		Summary:        activity.Summary,
		ToolName:       activity.ToolName,
		ModelCalls:     activity.ModelCalls,
		Stage:          activity.Stage,
		DiagnosticCode: activity.DiagnosticCode,
		Counts:         toActivityCountsDTO(activity.Counts),
		CreatedAt:      activity.CreatedAt,
		UpdatedAt:      activity.UpdatedAt,
	}
}

func toActivityCountsDTO(counts *protocol.RuntimeActivityCounts) *dto.KnowledgeQAActivityCounts {
	if counts == nil {
		return nil
	}
	return &dto.KnowledgeQAActivityCounts{
		AuthorizedKnowledgeBases:  counts.AuthorizedKnowledgeBases,
		AuthorizedSources:         counts.AuthorizedSources,
		MissingKnowledgeBases:     counts.MissingKnowledgeBases,
		MissingSources:            counts.MissingSources,
		UnavailableKnowledgeBases: counts.UnavailableKnowledgeBases,
		UnavailableSources:        counts.UnavailableSources,
		PartiallyAvailableSources: counts.PartiallyAvailableSources,
		ContextTurns:              counts.ContextTurns,
		SearchCalls:               counts.SearchCalls,
		ListCalls:                 counts.ListCalls,
		ReadCalls:                 counts.ReadCalls,
		WebSearchCalls:            counts.WebSearchCalls,
		WebReadCalls:              counts.WebReadCalls,
		WebSources:                counts.WebSources,
		RefCalls:                  counts.RefCalls,
		ModelCalls:                counts.ModelCalls,
		SearchedRoots:             counts.SearchedRoots,
	}
}

func nonNilStrings(values []string) []string {
	if values == nil {
		return []string{}
	}
	return values
}
