using MediatR;
using TakeoutSaaS.Application.App.Tenants.Contracts;
using TakeoutSaaS.Domain.Billings.Enums;
using TakeoutSaaS.Domain.Tenants.Enums;
namespace TakeoutSaaS.Application.App.Tenants.Commands;
///
/// 后台手动新增租户命令(直接入驻:创建租户 + 认证 + 订阅 + 管理员账号)。
///
public sealed record CreateTenantManuallyCommand : IRequest
{
// 1. 租户基本信息(public.tenants)
///
/// 租户编码(唯一)。
///
public required string Code { get; init; }
///
/// 租户名称。
///
public required string Name { get; init; }
///
/// 租户简称。
///
public string? ShortName { get; init; }
///
/// 法人/公司主体名称。
///
public string? LegalEntityName { get; init; }
///
/// 所属行业。
///
public string? Industry { get; init; }
///
/// LOGO 图片地址。
///
public string? LogoUrl { get; init; }
///
/// 封面图地址。
///
public string? CoverImageUrl { get; init; }
///
/// 官网地址。
///
public string? Website { get; init; }
///
/// 国家/地区。
///
public string? Country { get; init; }
///
/// 省份。
///
public string? Province { get; init; }
///
/// 城市。
///
public string? City { get; init; }
///
/// 详细地址。
///
public string? Address { get; init; }
///
/// 联系人姓名。
///
public string? ContactName { get; init; }
///
/// 联系人电话。
///
public string? ContactPhone { get; init; }
///
/// 联系人邮箱。
///
public string? ContactEmail { get; init; }
///
/// 标签(逗号分隔)。
///
public string? Tags { get; init; }
///
/// 备注。
///
public string? Remarks { get; init; }
///
/// 暂停时间。
///
public DateTime? SuspendedAt { get; init; }
///
/// 暂停原因。
///
public string? SuspensionReason { get; init; }
///
/// 租户状态。
///
public TenantStatus TenantStatus { get; init; } = TenantStatus.Active;
///
/// 是否跳过审核(直接激活)。
///
///
/// true:租户状态设为 Active,认证状态设为 Approved(默认)。
/// false:租户状态设为 PendingReview,认证状态设为 Pending,需后续审核。
///
public bool IsSkipApproval { get; init; } = true;
// 2. 订阅信息(public.tenant_subscriptions)
///
/// 套餐 ID(雪花算法,字符串传输)。
///
public required string TenantPackageId { get; init; }
///
/// 订阅时长(月)。
///
public int DurationMonths { get; init; } = 12;
///
/// 是否自动续费。
///
public bool AutoRenew { get; init; }
///
/// 订阅生效时间。
///
public DateTime? SubscriptionEffectiveFrom { get; init; }
///
/// 下次计费日期。
///
public DateTime? NextBillingDate { get; init; }
///
/// 订阅状态(0=待激活, 1=生效中, 2=宽限期, 3=已取消, 4=已暂停)。
///
public SubscriptionStatus SubscriptionStatus { get; init; } = SubscriptionStatus.Active;
///
/// 预约变更的套餐 ID。
///
public string? ScheduledPackageId { get; init; }
///
/// 订阅备注。
///
public string? SubscriptionNotes { get; init; }
// 3. 认证信息(public.tenant_verification_profiles)
///
/// 认证状态。
///
public TenantVerificationStatus VerificationStatus { get; init; } = TenantVerificationStatus.Approved;
///
/// 营业执照号。
///
public string? BusinessLicenseNumber { get; init; }
///
/// 营业执照图片 URL。
///
public string? BusinessLicenseUrl { get; init; }
///
/// 法人姓名。
///
public string? LegalPersonName { get; init; }
///
/// 法人身份证号。
///
public string? LegalPersonIdNumber { get; init; }
///
/// 法人身份证正面 URL。
///
public string? LegalPersonIdFrontUrl { get; init; }
///
/// 法人身份证背面 URL。
///
public string? LegalPersonIdBackUrl { get; init; }
///
/// 银行账户名。
///
public string? BankAccountName { get; init; }
///
/// 银行账号。
///
public string? BankAccountNumber { get; init; }
///
/// 开户银行。
///
public string? BankName { get; init; }
///
/// 附加数据 JSON。
///
public string? AdditionalDataJson { get; init; }
///
/// 审核人姓名。
///
public string? ReviewedByName { get; init; }
///
/// 审核备注。
///
public string? ReviewRemarks { get; init; }
// 4. 管理员账号(identity.identity_users)
///
/// 管理员登录账号。
///
public required string AdminAccount { get; init; }
///
/// 管理员显示名称。
///
public required string AdminDisplayName { get; init; }
///
/// 管理员密码(明文,后端哈希)。
///
public required string AdminPassword { get; init; }
///
/// 管理员头像。
///
public string? AdminAvatar { get; init; }
///
/// 管理员所属商户 ID。
///
public string? AdminMerchantId { get; init; }
// 5. 账单信息(public.tenant_billing_statements)
///
/// 是否创建账单。
///
public bool CreateBilling { get; init; } = true;
///
/// 账单金额(不填则根据套餐价格×月数计算)。
///
public decimal? BillingAmount { get; init; }
///
/// 折扣金额。
///
public decimal? BillingDiscountAmount { get; init; }
///
/// 账单状态(默认已支付)。
///
public TenantBillingStatus BillingStatus { get; init; } = TenantBillingStatus.Paid;
///
/// 账单备注。
///
public string? BillingNotes { get; init; }
}