using TakeoutSaaS.Domain.Coupons.Entities;

namespace TakeoutSaaS.Domain.Coupons.Repositories;

/// <summary>
/// 优惠券聚合仓储契约。
/// </summary>
public interface ICouponRepository
{
    /// <summary>
    /// 查询租户下的券模板列表。
    /// </summary>
    Task<IReadOnlyList<CouponTemplate>> GetTemplatesAsync(long tenantId, CancellationToken cancellationToken = default);

    /// <summary>
    /// 按标识查询券模板。
    /// </summary>
    Task<CouponTemplate?> FindTemplateByIdAsync(long templateId, long tenantId, CancellationToken cancellationToken = default);

    /// <summary>
    /// 新增券模板。
    /// </summary>
    Task AddTemplateAsync(CouponTemplate template, CancellationToken cancellationToken = default);

    /// <summary>
    /// 更新券模板。
    /// </summary>
    Task UpdateTemplateAsync(CouponTemplate template, CancellationToken cancellationToken = default);

    /// <summary>
    /// 删除券模板。
    /// </summary>
    Task DeleteTemplateAsync(CouponTemplate template, CancellationToken cancellationToken = default);

    /// <summary>
    /// 统计模板下已发放券总数。
    /// </summary>
    Task<int> CountIssuedCouponsByTemplateIdAsync(long tenantId, long templateId, CancellationToken cancellationToken = default);

    /// <summary>
    /// 按模板统计已核销券数量。
    /// </summary>
    Task<Dictionary<long, int>> CountRedeemedCouponsByTemplateIdsAsync(
        long tenantId,
        IReadOnlyCollection<long> templateIds,
        CancellationToken cancellationToken = default);

    /// <summary>
    /// 持久化变更。
    /// </summary>
    Task SaveChangesAsync(CancellationToken cancellationToken = default);
}
