package category

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

// CategoryCommands contains the command handlers for the category aggregate.
type CategoryCommands struct {
	repo domain.CategoryRepository
}

// NewCategoryCommands creates a new CategoryCommands handler.
func NewCategoryCommands(repo domain.CategoryRepository) *CategoryCommands {
	return &CategoryCommands{repo: repo}
}

// CreateCategoryInput represents the input for creating a new category.
type CreateCategoryInput struct {
	Name        string
	Description string
	ParentID    *uint
}

// CreateCategory creates a new category.
func (c *CategoryCommands) CreateCategory(ctx context.Context, input CreateCategoryInput) (*domain.Category, error) {
	category := &domain.Category{
		Name:        input.Name,
		Description: input.Description,
		ParentID:    input.ParentID,
	}
	err := c.repo.Create(ctx, category)
	if err != nil {
		return nil, err
	}
	return category, nil
}

// UpdateCategoryInput represents the input for updating an existing category.
type UpdateCategoryInput struct {
	ID          uint
	Name        string
	Description string
	ParentID    *uint
}

// UpdateCategory updates an existing category.
func (c *CategoryCommands) UpdateCategory(ctx context.Context, input UpdateCategoryInput) (*domain.Category, error) {
	category, err := c.repo.GetByID(ctx, input.ID)
	if err != nil {
		return nil, err
	}
	category.Name = input.Name
	category.Description = input.Description
	category.ParentID = input.ParentID
	err = c.repo.Update(ctx, category)
	if err != nil {
		return nil, err
	}
	return category, nil
}

// DeleteCategory deletes a category by ID.
func (c *CategoryCommands) DeleteCategory(ctx context.Context, id uint) error {
	return c.repo.Delete(ctx, id)
}
