package tools

import (
	"context"

	"github.com/google/uuid"

	"git.warky.dev/wdevs/amcs/internal/ai"
	"git.warky.dev/wdevs/amcs/internal/config"
	"git.warky.dev/wdevs/amcs/internal/store"
	thoughttypes "git.warky.dev/wdevs/amcs/internal/types"
)

// semanticSearch runs vector similarity search if embeddings exist for the
// primary embedding model in the given scope, otherwise falls back to Postgres
// full-text search. Search always uses the primary model so query vectors
// match rows stored under the primary model name.
func semanticSearch(
	ctx context.Context,
	db *store.DB,
	embeddings *ai.EmbeddingRunner,
	search config.SearchConfig,
	query string,
	limit int,
	threshold float64,
	projectID *int64,
	excludeID *uuid.UUID,
) ([]thoughttypes.SearchResult, error) {
	model := embeddings.PrimaryModel()
	hasEmbeddings, err := db.HasEmbeddingsForModel(ctx, model, projectID)
	if err != nil {
		return nil, err
	}

	if hasEmbeddings {
		embedding, err := embeddings.EmbedPrimary(ctx, query)
		if err != nil {
			return nil, err
		}
		return db.SearchSimilarThoughts(ctx, embedding, model, threshold, limit, projectID, excludeID)
	}

	return db.SearchThoughtsText(ctx, query, limit, projectID, excludeID)
}
