// EN: Paged result wrapper for query responses.
// VI: Wrapper kết quả phân trang cho query response.

namespace CatalogService.API.Application.DTOs;

/// <summary>
/// EN: Generic paged result for list queries.
/// VI: Kết quả phân trang chung cho các query danh sách.
/// </summary>
public record PagedResult<T>
{
    /// <summary>
    /// EN: Items in the current page.
    /// VI: Các items trong trang hiện tại.
    /// </summary>
    public IReadOnlyList<T> Items { get; init; } = Array.Empty<T>();

    /// <summary>
    /// EN: Total count of items across all pages.
    /// VI: Tổng số items trên tất cả các trang.
    /// </summary>
    public int TotalCount { get; init; }

    /// <summary>
    /// EN: Current page number (1-indexed).
    /// VI: Số trang hiện tại (bắt đầu từ 1).
    /// </summary>
    public int Page { get; init; }

    /// <summary>
    /// EN: Page size.
    /// VI: Kích thước trang.
    /// </summary>
    public int PageSize { get; init; }

    /// <summary>
    /// EN: Total number of pages.
    /// VI: Tổng số trang.
    /// </summary>
    public int TotalPages => (int)Math.Ceiling((double)TotalCount / PageSize);

    /// <summary>
    /// EN: Has previous page.
    /// VI: Có trang trước không.
    /// </summary>
    public bool HasPrevious => Page > 1;

    /// <summary>
    /// EN: Has next page.
    /// VI: Có trang tiếp theo không.
    /// </summary>
    public bool HasNext => Page < TotalPages;
}
