using TakeoutSaaS.Domain.Tenants.Entities;
using TakeoutSaaS.Domain.Tenants.Enums;

namespace TakeoutSaaS.Domain.Tenants.Repositories;

/// <summary>
/// 统计数据仓储接口。
/// </summary>
public interface IStatisticsRepository
{
    #region 订阅统计

    /// <summary>
    /// 获取所有订阅（用于统计）。
    /// </summary>
    /// <param name="cancellationToken">取消标记。</param>
    /// <returns>所有订阅记录。</returns>
    Task<IReadOnlyList<TenantSubscription>> GetAllSubscriptionsAsync(CancellationToken cancellationToken = default);

    /// <summary>
    /// 获取即将到期的订阅（含租户和套餐信息）。
    /// </summary>
    /// <param name="daysAhead">到期天数。</param>
    /// <param name="onlyWithoutAutoRenew">是否仅查询未开启自动续费的。</param>
    /// <param name="cancellationToken">取消标记。</param>
    /// <returns>即将到期的订阅信息列表。</returns>
    Task<IReadOnlyList<ExpiringSubscriptionInfo>> GetExpiringSubscriptionsAsync(
        int daysAhead,
        bool onlyWithoutAutoRenew,
        CancellationToken cancellationToken = default);

    #endregion

    #region 收入统计

    /// <summary>
    /// 获取所有已付款账单（用于收入统计）。
    /// </summary>
    /// <param name="cancellationToken">取消标记。</param>
    /// <returns>已付款账单列表。</returns>
    Task<IReadOnlyList<TenantBillingStatement>> GetPaidBillsAsync(CancellationToken cancellationToken = default);

    #endregion

    #region 配额使用排行

    /// <summary>
    /// 获取配额使用排行（含租户信息）。
    /// </summary>
    /// <param name="quotaType">配额类型。</param>
    /// <param name="topN">前 N 名。</param>
    /// <param name="cancellationToken">取消标记。</param>
    /// <returns>配额使用排行列表。</returns>
    Task<IReadOnlyList<QuotaUsageRankInfo>> GetQuotaUsageRankingAsync(
        TenantQuotaType quotaType,
        int topN,
        CancellationToken cancellationToken = default);

    #endregion
}

/// <summary>
/// 即将到期的订阅信息（含关联数据）。
/// </summary>
public record ExpiringSubscriptionInfo
{
    /// <summary>
    /// 订阅实体。
    /// </summary>
    public required TenantSubscription Subscription { get; init; }

    /// <summary>
    /// 租户名称。
    /// </summary>
    public required string TenantName { get; init; }

    /// <summary>
    /// 套餐名称。
    /// </summary>
    public required string PackageName { get; init; }
}

/// <summary>
/// 配额使用排行信息（含租户名称）。
/// </summary>
public record QuotaUsageRankInfo
{
    /// <summary>
    /// 租户 ID。
    /// </summary>
    public long TenantId { get; init; }

    /// <summary>
    /// 租户名称。
    /// </summary>
    public required string TenantName { get; init; }

    /// <summary>
    /// 已使用值。
    /// </summary>
    public decimal UsedValue { get; init; }

    /// <summary>
    /// 限制值。
    /// </summary>
    public decimal LimitValue { get; init; }

    /// <summary>
    /// 使用百分比。
    /// </summary>
    public decimal UsagePercentage { get; init; }
}
