using TakeoutSaaS.Domain.Tenants.Entities;
using TakeoutSaaS.Domain.Tenants.Enums;
namespace TakeoutSaaS.Domain.Tenants.Repositories;
///
/// 租户聚合仓储。
///
public interface ITenantRepository
{
///
/// 依据 ID 获取租户。
///
/// 租户 ID(雪花算法)。
/// 取消标记。
/// 租户实体,未找到返回 null。
Task FindByIdAsync(long tenantId, CancellationToken cancellationToken = default);
///
/// 按状态与关键词查询租户列表。
///
/// 租户状态,为空不按状态过滤。
/// 名称或编码关键字,为空不按关键字过滤。
/// 取消标记。
/// 符合条件的租户列表。
Task> SearchAsync(
TenantStatus? status,
string? keyword,
CancellationToken cancellationToken = default);
///
/// 分页查询租户(支持多条件过滤)。
///
/// 租户状态,为空不按状态过滤。
/// 实名认证状态,为空不按认证状态过滤。
/// 租户名称,为空不按名称过滤。
/// 联系人姓名,为空不按联系人过滤。
/// 联系电话,为空不按电话过滤。
/// 兼容关键词:名称/编码/联系人/电话,为空不按关键字过滤。
/// 页码(从 1 开始)。
/// 每页大小。
/// 取消标记。
/// 分页数据与总数。
Task<(IReadOnlyList Items, int Total)> SearchPagedAsync(
TenantStatus? status,
TenantVerificationStatus? verificationStatus,
string? name,
string? contactName,
string? contactPhone,
string? keyword,
int page,
int pageSize,
CancellationToken cancellationToken = default);
///
/// 新增租户。
///
/// 租户实体。
/// 取消标记。
/// 异步任务。
Task AddTenantAsync(Tenant tenant, CancellationToken cancellationToken = default);
///
/// 更新租户。
///
/// 租户实体。
/// 取消标记。
/// 异步任务。
Task UpdateTenantAsync(Tenant tenant, CancellationToken cancellationToken = default);
///
/// 判断编码是否存在。
///
/// 租户编码。
/// 取消标记。
/// 存在返回 true,否则 false。
Task ExistsByCodeAsync(string code, CancellationToken cancellationToken = default);
///
/// 判断联系人手机号是否存在。
///
/// 联系人手机号。
/// 取消标记。
/// 存在返回 true,否则 false。
Task ExistsByContactPhoneAsync(string phone, CancellationToken cancellationToken = default);
///
/// 依据联系人手机号查询租户 ID。
///
/// 联系人手机号。
/// 取消标记。
/// 租户 ID,未找到返回 null。
Task FindTenantIdByContactPhoneAsync(string phone, CancellationToken cancellationToken = default);
///
/// 获取实名资料。
///
/// 租户 ID(雪花算法)。
/// 取消标记。
/// 实名资料实体,未提交返回 null。
Task GetVerificationProfileAsync(long tenantId, CancellationToken cancellationToken = default);
///
/// 批量获取实名资料。
///
/// 租户 ID 列表。
/// 取消标记。
/// 实名资料列表(未提交的不返回)。
Task> GetVerificationProfilesAsync(
IReadOnlyCollection tenantIds,
CancellationToken cancellationToken = default);
///
/// 新增或更新实名资料。
///
/// 实名资料实体。
/// 取消标记。
/// 异步任务。
Task UpsertVerificationProfileAsync(TenantVerificationProfile profile, CancellationToken cancellationToken = default);
///
/// 获取当前订阅。
///
/// 租户 ID(雪花算法)。
/// 取消标记。
/// 当前有效订阅,若无则 null。
Task GetActiveSubscriptionAsync(long tenantId, CancellationToken cancellationToken = default);
///
/// 批量获取当前订阅。
///
/// 租户 ID 列表。
/// 取消标记。
/// 订阅列表(可能包含同一租户的多条订阅记录)。
Task> GetSubscriptionsAsync(
IReadOnlyCollection tenantIds,
CancellationToken cancellationToken = default);
///
/// 依据订阅 ID 查询。
///
/// 租户 ID(雪花算法)。
/// 订阅 ID(雪花算法)。
/// 取消标记。
/// 订阅实体,未找到返回 null。
Task FindSubscriptionByIdAsync(long tenantId, long subscriptionId, CancellationToken cancellationToken = default);
///
/// 新增订阅。
///
/// 订阅实体。
/// 取消标记。
/// 异步任务。
Task AddSubscriptionAsync(TenantSubscription subscription, CancellationToken cancellationToken = default);
///
/// 更新订阅。
///
/// 订阅实体。
/// 取消标记。
/// 异步任务。
Task UpdateSubscriptionAsync(TenantSubscription subscription, CancellationToken cancellationToken = default);
///
/// 记录订阅历史。
///
/// 订阅历史实体。
/// 取消标记。
/// 异步任务。
Task AddSubscriptionHistoryAsync(TenantSubscriptionHistory history, CancellationToken cancellationToken = default);
///
/// 获取订阅历史。
///
/// 租户 ID(雪花算法)。
/// 取消标记。
/// 订阅历史列表。
Task> GetSubscriptionHistoryAsync(long tenantId, CancellationToken cancellationToken = default);
///
/// 新增审核日志。
///
/// 审核日志实体。
/// 取消标记。
/// 异步任务。
Task AddAuditLogAsync(TenantAuditLog log, CancellationToken cancellationToken = default);
///
/// 查询审核日志。
///
/// 租户 ID(雪花算法)。
/// 取消标记。
/// 审核日志列表。
Task> GetAuditLogsAsync(long tenantId, CancellationToken cancellationToken = default);
///
/// 持久化。
///
/// 取消标记。
/// 异步任务。
Task SaveChangesAsync(CancellationToken cancellationToken = default);
}