using MediatR;
using TakeoutSaaS.Application.App.TenantPackages.Contracts;
using TakeoutSaaS.Domain.Tenants.Enums;

namespace TakeoutSaaS.Application.App.TenantPackages.Commands;

/// <summary>
/// 更新租户套餐命令。
/// </summary>
public sealed record UpdateTenantPackageCommand : IRequest<TenantPackageListDto?>
{
    /// <summary>
    /// 套餐 ID。
    /// </summary>
    public long TenantPackageId { get; init; }

    /// <summary>
    /// 套餐名称。
    /// </summary>
    public string Name { get; init; } = string.Empty;

    /// <summary>
    /// 套餐描述。
    /// </summary>
    public string? Description { get; init; }

    /// <summary>
    /// 套餐类型。
    /// </summary>
    public TenantPackageType PackageType { get; init; }

    /// <summary>
    /// 月付价格。
    /// </summary>
    public decimal? MonthlyPrice { get; init; }

    /// <summary>
    /// 年付价格。
    /// </summary>
    public decimal? YearlyPrice { get; init; }

    /// <summary>
    /// 最大门店数。
    /// </summary>
    public int? MaxStoreCount { get; init; }

    /// <summary>
    /// 最大账号数。
    /// </summary>
    public int? MaxAccountCount { get; init; }

    /// <summary>
    /// 最大存储空间（GB）。
    /// </summary>
    public int? MaxStorageGb { get; init; }

    /// <summary>
    /// 最大短信额度。
    /// </summary>
    public int? MaxSmsCredits { get; init; }

    /// <summary>
    /// 最大配送订单数。
    /// </summary>
    public int? MaxDeliveryOrders { get; init; }

    /// <summary>
    /// 功能策略 JSON。
    /// </summary>
    public string? FeaturePoliciesJson { get; init; }

    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool IsActive { get; init; }

    /// <summary>
    /// 是否公开可见。
    /// </summary>
    public bool IsPublicVisible { get; init; }

    /// <summary>
    /// 是否允许新租户购买。
    /// </summary>
    public bool IsAllowNewTenantPurchase { get; init; }

    /// <summary>
    /// 发布状态。
    /// </summary>
    public TenantPackagePublishStatus PublishStatus { get; init; }

    /// <summary>
    /// 是否推荐。
    /// </summary>
    public bool IsRecommended { get; init; }

    /// <summary>
    /// 标签列表。
    /// </summary>
    public string[] Tags { get; init; } = [];

    /// <summary>
    /// 排序序号。
    /// </summary>
    public int SortOrder { get; init; }
}
