using System.Text.Json.Serialization;
using TakeoutSaaS.Domain.Common.Enums;
using TakeoutSaaS.Domain.Tenants.Enums;
using TakeoutSaaS.Shared.Abstractions.Serialization;

namespace TakeoutSaaS.Application.App.Tenants.Contracts;

/// <summary>
/// 租户详情 DTO（包含认证、订阅、套餐信息）。
/// </summary>
public sealed record TenantDetailDto
{
    /// <summary>
    /// 租户基本信息。
    /// </summary>
    public required TenantDto Tenant { get; init; }

    /// <summary>
    /// 认证信息。
    /// </summary>
    public TenantVerificationDto? Verification { get; init; }

    /// <summary>
    /// 订阅信息。
    /// </summary>
    public TenantSubscriptionDto? Subscription { get; init; }

    /// <summary>
    /// 套餐信息。
    /// </summary>
    public TenantPackageDto? Package { get; init; }
}

/// <summary>
/// 租户基本信息 DTO。
/// </summary>
public sealed record TenantDto
{
    /// <summary>
    /// 租户 ID（雪花，序列化为字符串）。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long Id { get; init; }

    /// <summary>
    /// 租户编码。
    /// </summary>
    public string Code { get; init; } = string.Empty;

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

    /// <summary>
    /// 租户简称。
    /// </summary>
    public string? ShortName { get; init; }

    /// <summary>
    /// 所属行业。
    /// </summary>
    public string? Industry { get; init; }

    /// <summary>
    /// 联系人姓名。
    /// </summary>
    public string? ContactName { get; init; }

    /// <summary>
    /// 联系人电话。
    /// </summary>
    public string? ContactPhone { get; init; }

    /// <summary>
    /// 联系人邮箱。
    /// </summary>
    public string? ContactEmail { get; init; }

    /// <summary>
    /// 租户状态。
    /// </summary>
    public TenantStatus Status { get; init; }

    /// <summary>
    /// 认证状态。
    /// </summary>
    public TenantVerificationStatus VerificationStatus { get; init; }

    /// <summary>
    /// 经营模式。
    /// </summary>
    public OperatingMode? OperatingMode { get; init; }

    /// <summary>
    /// 当前套餐 ID。
    /// </summary>
    [JsonConverter(typeof(NullableSnowflakeIdJsonConverter))]
    public long? CurrentPackageId { get; init; }

    /// <summary>
    /// 服务生效时间。
    /// </summary>
    public DateTime? EffectiveFrom { get; init; }

    /// <summary>
    /// 服务到期时间。
    /// </summary>
    public DateTime? EffectiveTo { get; init; }

    /// <summary>
    /// 是否自动续费。
    /// </summary>
    public bool AutoRenew { get; init; }
}

/// <summary>
/// 租户认证信息 DTO。
/// </summary>
public sealed record TenantVerificationDto
{
    /// <summary>
    /// 认证记录 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long Id { get; init; }

    /// <summary>
    /// 租户 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long TenantId { get; init; }

    /// <summary>
    /// 认证状态。
    /// </summary>
    public TenantVerificationStatus Status { get; init; }

    /// <summary>
    /// 营业执照号。
    /// </summary>
    public string? BusinessLicenseNumber { get; init; }

    /// <summary>
    /// 营业执照图片 URL。
    /// </summary>
    public string? BusinessLicenseUrl { get; init; }

    /// <summary>
    /// 法人姓名。
    /// </summary>
    public string? LegalPersonName { get; init; }

    /// <summary>
    /// 法人身份证号。
    /// </summary>
    public string? LegalPersonIdNumber { get; init; }

    /// <summary>
    /// 法人身份证正面 URL。
    /// </summary>
    public string? LegalPersonIdFrontUrl { get; init; }

    /// <summary>
    /// 法人身份证背面 URL。
    /// </summary>
    public string? LegalPersonIdBackUrl { get; init; }

    /// <summary>
    /// 银行账户名。
    /// </summary>
    public string? BankAccountName { get; init; }

    /// <summary>
    /// 银行账号。
    /// </summary>
    public string? BankAccountNumber { get; init; }

    /// <summary>
    /// 开户银行。
    /// </summary>
    public string? BankName { get; init; }

    /// <summary>
    /// 附加数据 JSON。
    /// </summary>
    public string? AdditionalDataJson { get; init; }

    /// <summary>
    /// 提交时间。
    /// </summary>
    public DateTime? SubmittedAt { get; init; }

    /// <summary>
    /// 审核人 ID。
    /// </summary>
    [JsonConverter(typeof(NullableSnowflakeIdJsonConverter))]
    public long? ReviewedBy { get; init; }

    /// <summary>
    /// 审核备注。
    /// </summary>
    public string? ReviewRemarks { get; init; }

    /// <summary>
    /// 审核人姓名。
    /// </summary>
    public string? ReviewedByName { get; init; }

    /// <summary>
    /// 审核时间。
    /// </summary>
    public DateTime? ReviewedAt { get; init; }
}

/// <summary>
/// 租户订阅信息 DTO。
/// </summary>
public sealed record TenantSubscriptionDto
{
    /// <summary>
    /// 订阅 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long Id { get; init; }

    /// <summary>
    /// 租户 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long TenantId { get; init; }

    /// <summary>
    /// 套餐 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long TenantPackageId { get; init; }

    /// <summary>
    /// 订阅状态。
    /// </summary>
    public SubscriptionStatus Status { get; init; }

    /// <summary>
    /// 生效时间。
    /// </summary>
    public DateTime EffectiveFrom { get; init; }

    /// <summary>
    /// 到期时间。
    /// </summary>
    public DateTime EffectiveTo { get; init; }

    /// <summary>
    /// 下次计费日期。
    /// </summary>
    public DateTime? NextBillingDate { get; init; }

    /// <summary>
    /// 是否自动续费。
    /// </summary>
    public bool AutoRenew { get; init; }
}

/// <summary>
/// 租户套餐信息 DTO。
/// </summary>
public sealed record TenantPackageDto
{
    /// <summary>
    /// 套餐 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long Id { 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; }
}
