using MediatR;
using FacebookService.API.Application.Dtos;

namespace FacebookService.API.Application.Queries;

/// <summary>
/// EN: Query to get a Customer by ID.
/// VI: Query để lấy một Customer theo ID.
/// </summary>
/// <param name="CustomerId">EN: Customer ID / VI: ID customer</param>
public record GetCustomerByIdQuery(Guid CustomerId) : IRequest<CustomerDto?>;

/// <summary>
/// EN: Query to get a Customer by Facebook User ID.
/// VI: Query để lấy một Customer theo Facebook User ID.
/// </summary>
/// <param name="FacebookUserId">EN: Facebook User ID / VI: ID người dùng Facebook</param>
public record GetCustomerByFacebookIdQuery(string FacebookUserId) : IRequest<CustomerDto?>;

/// <summary>
/// EN: Query to get customers with pagination and filtering.
/// VI: Query để lấy danh sách customers với phân trang và lọc.
/// </summary>
/// <param name="ShopId">EN: Shop ID / VI: ID shop</param>
/// <param name="Tags">EN: Optional tag filter / VI: Lọc theo tags tùy chọn</param>
/// <param name="Search">EN: Optional search term / VI: Từ khóa tìm kiếm tùy chọn</param>
/// <param name="Skip">EN: Number to skip / VI: Số lượng bỏ qua</param>
/// <param name="Take">EN: Number to take / VI: Số lượng lấy</param>
public record GetCustomersQuery(
    Guid? ShopId = null,
    IEnumerable<string>? Tags = null,
    string? Search = null,
    int Skip = 0,
    int Take = 20
) : IRequest<GetCustomersQueryResult>;

/// <summary>
/// EN: Result of GetCustomersQuery with pagination info.
/// VI: Kết quả của GetCustomersQuery với thông tin phân trang.
/// </summary>
public record GetCustomersQueryResult(
    IReadOnlyList<CustomerSummaryDto> Customers,
    int TotalCount
);
