package author

import (
	"context"
	"tercul/internal/domain"
)

// AuthorQueries contains the query handlers for the author aggregate.
type AuthorQueries struct {
	repo domain.AuthorRepository
}

// NewAuthorQueries creates a new AuthorQueries handler.
func NewAuthorQueries(repo domain.AuthorRepository) *AuthorQueries {
	return &AuthorQueries{repo: repo}
}

// Author returns an author by ID.
func (q *AuthorQueries) Author(ctx context.Context, id uint) (*domain.Author, error) {
	return q.repo.GetByID(ctx, id)
}

// Authors returns all authors, with optional filtering by country.
func (q *AuthorQueries) Authors(ctx context.Context, countryID *uint) ([]*domain.Author, error) {
	var authors []domain.Author
	var err error

	if countryID != nil {
		authors, err = q.repo.ListByCountryID(ctx, *countryID)
	} else {
		authors, err = q.repo.ListAll(ctx)
	}

	if err != nil {
		return nil, err
	}

	authorPtrs := make([]*domain.Author, len(authors))
	for i := range authors {
		authorPtrs[i] = &authors[i]
	}
	return authorPtrs, nil
}

// AuthorWithTranslations returns an author by ID with its translations.
func (q *AuthorQueries) AuthorWithTranslations(ctx context.Context, id uint) (*domain.Author, error) {
	return q.repo.GetWithTranslations(ctx, id)
}
