package search

import (
	"context"
	"tercul/internal/app/localization"
	"tercul/internal/domain"
	domainsearch "tercul/internal/domain/search"
	"tercul/internal/platform/log"
)

// Service is the application service for searching.
type Service interface {
	Search(ctx context.Context, query string, page, pageSize int, filters domain.SearchFilters) (*domain.SearchResults, error)
	IndexWork(ctx context.Context, work domain.Work) error
}

type service struct {
	searchClient domainsearch.SearchClient
	localization *localization.Service
}

// NewService creates a new search Service.
func NewService(searchClient domainsearch.SearchClient, localization *localization.Service) Service {
	return &service{
		searchClient: searchClient,
		localization: localization,
	}
}

// Search performs a search across all searchable entities.
func (s *service) Search(ctx context.Context, query string, page, pageSize int, filters domain.SearchFilters) (*domain.SearchResults, error) {
	// For now, this is a mock implementation that returns empty results.
	// TODO: Implement the actual search logic.
	return &domain.SearchResults{
		Works:        []domain.Work{},
		Translations: []domain.Translation{},
		Authors:      []domain.Author{},
		Total:        0,
	}, nil
}

func (s *service) IndexWork(ctx context.Context, work domain.Work) error {
	logger := log.FromContext(ctx).With("work_id", work.ID)
	logger.Debug("Indexing work")

	// Get content from translation service
	content, err := s.localization.Queries.GetWorkContent(ctx, work.ID, work.Language)
	if err != nil {
		logger.Error(err, "Failed to get work content for indexing")
		// We can choose to index without content or return an error.
		// For now, we'll log the error and continue indexing with empty content.
		content = ""
	}

	err = s.searchClient.IndexWork(ctx, &work, content)
	if err != nil {
		logger.Error(err, "Failed to index work in Weaviate")
		return err
	}
	logger.Info("Successfully indexed work")
	return nil
}