<?php

declare(strict_types=1);

namespace App\Administration\Application\Dto;

/**
 * Résultat paginé générique retourné par les Query Handlers.
 *
 * @template T
 */
final readonly class PaginatedResult
{
    public const int DEFAULT_PAGE = 1;
    public const int DEFAULT_LIMIT = 30;
    public const int MAX_LIMIT = 100;
    public const int MAX_SEARCH_LENGTH = 255;

    /**
     * @param T[] $items Les éléments de la page courante
     * @param int $total Le nombre total d'éléments (toutes pages confondues)
     * @param int $page  La page courante (1-indexed)
     * @param int $limit Le nombre d'éléments par page
     */
    public function __construct(
        public array $items,
        public int $total,
        public int $page,
        public int $limit,
    ) {
    }

    public function totalPages(): int
    {
        if ($this->limit <= 0) {
            return 0;
        }

        return (int) ceil($this->total / $this->limit);
    }
}
