using MediatR;
using TakeoutSaaS.Application.Identity.Contracts;
using TakeoutSaaS.Domain.Identity.Enums;
using TakeoutSaaS.Shared.Abstractions.Results;

namespace TakeoutSaaS.Application.Identity.Queries;

/// <summary>
/// 用户列表查询。
/// </summary>
public sealed record SearchIdentityUsersQuery : IRequest<PagedResult<UserListItemDto>>
{
    /// <summary>
    /// 租户 ID（可选，默认当前登录租户；禁止跨租户查询）。
    /// </summary>
    public long? TenantId { get; init; }

    /// <summary>
    /// 关键字（账号/姓名/手机号/邮箱）。
    /// </summary>
    public string? Keyword { get; init; }

    /// <summary>
    /// 用户状态。
    /// </summary>
    public IdentityUserStatus? Status { get; init; }

    /// <summary>
    /// 角色 ID。
    /// </summary>
    public long? RoleId { get; init; }

    /// <summary>
    /// 创建开始时间（UTC）。
    /// </summary>
    public DateTime? CreatedAtFrom { get; init; }

    /// <summary>
    /// 创建结束时间（UTC）。
    /// </summary>
    public DateTime? CreatedAtTo { get; init; }

    /// <summary>
    /// 最近登录开始时间（UTC）。
    /// </summary>
    public DateTime? LastLoginFrom { get; init; }

    /// <summary>
    /// 最近登录结束时间（UTC）。
    /// </summary>
    public DateTime? LastLoginTo { get; init; }

    /// <summary>
    /// 是否包含已删除用户。
    /// </summary>
    public bool IncludeDeleted { get; init; }

    /// <summary>
    /// 页码（从 1 开始）。
    /// </summary>
    public int Page { get; init; } = 1;

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

    /// <summary>
    /// 排序字段。
    /// </summary>
    public string? SortBy { get; init; }

    /// <summary>
    /// 是否降序。
    /// </summary>
    public bool SortDescending { get; init; } = true;
}
