package author

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

// AuthorCommands contains the command handlers for the author aggregate.
type AuthorCommands struct {
	repo domain.AuthorRepository
}

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

// CreateAuthorInput represents the input for creating a new author.
type CreateAuthorInput struct {
	Name string
}

// CreateAuthor creates a new author.
func (c *AuthorCommands) CreateAuthor(ctx context.Context, input CreateAuthorInput) (*domain.Author, error) {
	author := &domain.Author{
		Name: input.Name,
	}
	err := c.repo.Create(ctx, author)
	if err != nil {
		return nil, err
	}
	return author, nil
}

// UpdateAuthorInput represents the input for updating an existing author.
type UpdateAuthorInput struct {
	ID   uint
	Name string
}

// UpdateAuthor updates an existing author.
func (c *AuthorCommands) UpdateAuthor(ctx context.Context, input UpdateAuthorInput) (*domain.Author, error) {
	author, err := c.repo.GetByID(ctx, input.ID)
	if err != nil {
		return nil, err
	}
	author.Name = input.Name
	err = c.repo.Update(ctx, author)
	if err != nil {
		return nil, err
	}
	return author, nil
}

// DeleteAuthor deletes an author by ID.
func (c *AuthorCommands) DeleteAuthor(ctx context.Context, id uint) error {
	return c.repo.Delete(ctx, id)
}
