namespace TakeoutSaaS.Application.App.Personal.Dto;

/// <summary>
/// 个人中心通用分页查询契约。
/// </summary>
public sealed record PersonalPagedQuery
{
    /// <summary>
    /// 页码，从 1 开始。
    /// </summary>
    public int Page { get; init; } = 1;

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; init; } = 20;

    /// <summary>
    /// 查询开始时间（UTC）。
    /// </summary>
    public DateTime? From { get; init; }

    /// <summary>
    /// 查询结束时间（UTC）。
    /// </summary>
    public DateTime? To { get; init; }

    /// <summary>
    /// 获取有效页码。
    /// </summary>
    /// <returns>最小为 1 的页码。</returns>
    public int ResolvePage()
    {
        // 1. 对非法页码做兜底
        return Page < 1 ? 1 : Page;
    }

    /// <summary>
    /// 获取有效页大小。
    /// </summary>
    /// <param name="defaultPageSize">默认页大小。</param>
    /// <param name="maxPageSize">最大页大小。</param>
    /// <returns>落在约束范围内的页大小。</returns>
    public int ResolvePageSize(int defaultPageSize = 20, int maxPageSize = 50)
    {
        // 1. 兜底默认值
        var resolvedDefault = defaultPageSize <= 0 ? 20 : defaultPageSize;
        var resolvedMax = maxPageSize <= 0 ? 50 : maxPageSize;

        // 2. 对非法页大小做兜底
        if (PageSize <= 0)
        {
            return resolvedDefault;
        }

        // 3. 对超限页大小做截断
        return PageSize > resolvedMax ? resolvedMax : PageSize;
    }
}
