// EN: Subscription queries and DTOs.
// VI: Queries và DTOs cho gói đăng ký.

using MediatR;

namespace MerchantService.API.Application.Queries.Subscriptions;

/// <summary>
/// EN: Query to get current merchant's subscription info.
/// VI: Query để lấy thông tin gói đăng ký của merchant hiện tại.
/// </summary>
public record GetSubscriptionQuery(Guid UserId) : IRequest<SubscriptionDto?>;

/// <summary>
/// EN: Query to get all available subscription plans.
/// VI: Query để lấy danh sách tất cả gói đăng ký.
/// </summary>
public record GetSubscriptionPlansQuery : IRequest<IReadOnlyList<SubscriptionPlanDto>>;

/// <summary>
/// EN: Query to get current usage vs limits.
/// VI: Query để lấy mức sử dụng hiện tại so với giới hạn.
/// </summary>
public record GetSubscriptionUsageQuery(Guid UserId) : IRequest<SubscriptionUsageDto?>;

/// <summary>
/// EN: Current subscription DTO.
/// VI: DTO gói đăng ký hiện tại.
/// </summary>
public record SubscriptionDto
{
    /// <summary>
    /// EN: Plan ID (0=Starter, 1=Growth, 2=Pro, 3=Enterprise).
    /// VI: ID gói (0=Starter, 1=Growth, 2=Pro, 3=Enterprise).
    /// </summary>
    public int PlanId { get; init; }

    /// <summary>
    /// EN: Plan name.
    /// VI: Tên gói.
    /// </summary>
    public string PlanName { get; init; } = null!;

    /// <summary>
    /// EN: Max number of shops allowed.
    /// VI: Số shop tối đa được phép.
    /// </summary>
    public int MaxShops { get; init; }

    /// <summary>
    /// EN: Max number of staff per shop.
    /// VI: Số nhân viên tối đa mỗi shop.
    /// </summary>
    public int MaxStaffPerShop { get; init; }

    /// <summary>
    /// EN: Max number of products.
    /// VI: Số sản phẩm tối đa.
    /// </summary>
    public int MaxProducts { get; init; }

    /// <summary>
    /// EN: Whether analytics feature is available.
    /// VI: Tính năng phân tích có khả dụng không.
    /// </summary>
    public bool HasAnalytics { get; init; }

    /// <summary>
    /// EN: Whether priority support is available.
    /// VI: Hỗ trợ ưu tiên có khả dụng không.
    /// </summary>
    public bool HasPrioritySupport { get; init; }
}

/// <summary>
/// EN: Subscription plan DTO.
/// VI: DTO gói đăng ký.
/// </summary>
public record SubscriptionPlanDto
{
    public int Id { get; init; }
    public string Name { get; init; } = null!;
    public string Description { get; init; } = null!;
    public decimal MonthlyPrice { get; init; }
    public int MaxShops { get; init; }
    public int MaxStaffPerShop { get; init; }
    public int MaxProducts { get; init; }
    public bool HasAnalytics { get; init; }
    public bool HasPrioritySupport { get; init; }
}

/// <summary>
/// EN: Subscription usage DTO — current usage vs plan limits.
/// VI: DTO mức sử dụng — sử dụng hiện tại so với giới hạn gói.
/// </summary>
public record SubscriptionUsageDto
{
    public int PlanId { get; init; }
    public string PlanName { get; init; } = null!;
    public int ShopsUsed { get; init; }
    public int ShopsLimit { get; init; }
    public int StaffUsed { get; init; }
    public int StaffLimit { get; init; }
    public int ProductsUsed { get; init; }
    public int ProductsLimit { get; init; }
}
