namespace TakeoutSaaS.Application.App.Members.Dto;

/// <summary>
/// 会员列表行 DTO。
/// </summary>
public sealed class MemberListItemDto
{
    /// <summary>
    /// 会员标识。
    /// </summary>
    public long MemberId { get; init; }

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

    /// <summary>
    /// 头像文案。
    /// </summary>
    public string AvatarText { get; init; } = string.Empty;

    /// <summary>
    /// 头像颜色。
    /// </summary>
    public string AvatarColor { get; init; } = string.Empty;

    /// <summary>
    /// 手机号（脱敏）。
    /// </summary>
    public string MobileMasked { get; init; } = string.Empty;

    /// <summary>
    /// 会员等级标识。
    /// </summary>
    public long? TierId { get; init; }

    /// <summary>
    /// 会员等级名称。
    /// </summary>
    public string TierName { get; init; } = string.Empty;

    /// <summary>
    /// 等级主题色。
    /// </summary>
    public string TierColorHex { get; init; } = string.Empty;

    /// <summary>
    /// 累计消费。
    /// </summary>
    public decimal TotalAmount { get; init; }

    /// <summary>
    /// 消费次数。
    /// </summary>
    public int OrderCount { get; init; }

    /// <summary>
    /// 最近消费时间。
    /// </summary>
    public DateTime LastOrderAt { get; init; }

    /// <summary>
    /// 储值余额。
    /// </summary>
    public decimal StoredBalance { get; init; }

    /// <summary>
    /// 积分余额。
    /// </summary>
    public int PointsBalance { get; init; }

    /// <summary>
    /// 是否沉睡会员（用于弱化展示）。
    /// </summary>
    public bool IsDormant { get; init; }
}

/// <summary>
/// 会员列表统计 DTO。
/// </summary>
public sealed class MemberListStatsDto
{
    /// <summary>
    /// 会员总数。
    /// </summary>
    public int TotalMembers { get; init; }

    /// <summary>
    /// 本月新增会员数。
    /// </summary>
    public int MonthlyNewMembers { get; init; }

    /// <summary>
    /// 活跃会员数（近 30 天有消费）。
    /// </summary>
    public int ActiveMembers { get; init; }

    /// <summary>
    /// 沉睡会员数（超过 60 天未消费）。
    /// </summary>
    public int DormantMembers { get; init; }
}

/// <summary>
/// 会员最近订单 DTO。
/// </summary>
public sealed class MemberRecentOrderDto
{
    /// <summary>
    /// 日期。
    /// </summary>
    public DateTime OrderedAt { get; init; }

    /// <summary>
    /// 订单号。
    /// </summary>
    public string OrderNo { get; init; } = string.Empty;

    /// <summary>
    /// 订单金额。
    /// </summary>
    public decimal Amount { get; init; }

    /// <summary>
    /// 订单状态文案。
    /// </summary>
    public string StatusText { get; init; } = string.Empty;
}

/// <summary>
/// 会员详情 DTO。
/// </summary>
public sealed class MemberDetailDto
{
    /// <summary>
    /// 会员标识。
    /// </summary>
    public long MemberId { get; init; }

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

    /// <summary>
    /// 头像文案。
    /// </summary>
    public string AvatarText { get; init; } = string.Empty;

    /// <summary>
    /// 头像颜色。
    /// </summary>
    public string AvatarColor { get; init; } = string.Empty;

    /// <summary>
    /// 手机号（脱敏）。
    /// </summary>
    public string MobileMasked { get; init; } = string.Empty;

    /// <summary>
    /// 注册时间。
    /// </summary>
    public DateTime JoinedAt { get; init; }

    /// <summary>
    /// 会员等级标识。
    /// </summary>
    public long? TierId { get; init; }

    /// <summary>
    /// 会员等级名称。
    /// </summary>
    public string TierName { get; init; } = string.Empty;

    /// <summary>
    /// 等级主题色。
    /// </summary>
    public string TierColorHex { get; init; } = string.Empty;

    /// <summary>
    /// 累计消费。
    /// </summary>
    public decimal TotalAmount { get; init; }

    /// <summary>
    /// 消费次数。
    /// </summary>
    public int OrderCount { get; init; }

    /// <summary>
    /// 平均客单价。
    /// </summary>
    public decimal AverageAmount { get; init; }

    /// <summary>
    /// 储值余额。
    /// </summary>
    public decimal StoredBalance { get; init; }

    /// <summary>
    /// 储值实充余额。
    /// </summary>
    public decimal StoredRechargeBalance { get; init; }

    /// <summary>
    /// 储值赠金余额。
    /// </summary>
    public decimal StoredGiftBalance { get; init; }

    /// <summary>
    /// 积分余额。
    /// </summary>
    public int PointsBalance { get; init; }

    /// <summary>
    /// 会员标签。
    /// </summary>
    public IReadOnlyList<string> Tags { get; init; } = [];

    /// <summary>
    /// 最近订单。
    /// </summary>
    public IReadOnlyList<MemberRecentOrderDto> RecentOrders { get; init; } = [];
}

/// <summary>
/// 会员列表导出 DTO。
/// </summary>
public sealed class MemberExportDto
{
    /// <summary>
    /// 文件名。
    /// </summary>
    public string FileName { get; init; } = string.Empty;

    /// <summary>
    /// 文件内容 Base64。
    /// </summary>
    public string FileContentBase64 { get; init; } = string.Empty;

    /// <summary>
    /// 导出总数。
    /// </summary>
    public int TotalCount { get; init; }
}

/// <summary>
/// 会员等级列表项 DTO。
/// </summary>
public sealed class MemberTierListItemDto
{
    /// <summary>
    /// 等级标识。
    /// </summary>
    public long TierId { get; init; }

    /// <summary>
    /// 排序序号。
    /// </summary>
    public int SortOrder { get; init; }

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

    /// <summary>
    /// 图标键。
    /// </summary>
    public string IconKey { get; init; } = string.Empty;

    /// <summary>
    /// 主题色。
    /// </summary>
    public string ColorHex { get; init; } = string.Empty;

    /// <summary>
    /// 升级条件文案。
    /// </summary>
    public string ConditionText { get; init; } = string.Empty;

    /// <summary>
    /// 权益摘要。
    /// </summary>
    public IReadOnlyList<string> Perks { get; init; } = [];

    /// <summary>
    /// 等级会员数。
    /// </summary>
    public int MemberCount { get; init; }

    /// <summary>
    /// 是否默认等级。
    /// </summary>
    public bool IsDefault { get; init; }

    /// <summary>
    /// 是否可删除。
    /// </summary>
    public bool CanDelete { get; init; }
}

/// <summary>
/// 会员等级规则 DTO。
/// </summary>
public sealed class MemberTierRuleDto
{
    /// <summary>
    /// 升级规则类型（none/amount/count/both）。
    /// </summary>
    public string UpgradeRuleType { get; init; } = "none";

    /// <summary>
    /// 升级累计消费门槛。
    /// </summary>
    public decimal? UpgradeAmountThreshold { get; init; }

    /// <summary>
    /// 升级消费次数门槛。
    /// </summary>
    public int? UpgradeOrderCountThreshold { get; init; }

    /// <summary>
    /// 降级观察窗口天数。
    /// </summary>
    public int DowngradeWindowDays { get; init; } = 90;
}

/// <summary>
/// 会员等级权益 DTO。
/// </summary>
public sealed class MemberTierBenefitsDto
{
    /// <summary>
    /// 折扣权益。
    /// </summary>
    public MemberTierDiscountBenefitDto Discount { get; init; } = new();

    /// <summary>
    /// 积分倍率权益。
    /// </summary>
    public MemberTierPointMultiplierBenefitDto PointMultiplier { get; init; } = new();

    /// <summary>
    /// 生日特权。
    /// </summary>
    public MemberTierBirthdayBenefitDto Birthday { get; init; } = new();

    /// <summary>
    /// 每月赠券。
    /// </summary>
    public MemberTierMonthlyCouponBenefitDto MonthlyCoupon { get; init; } = new();

    /// <summary>
    /// 免配送费权益。
    /// </summary>
    public MemberTierFreeDeliveryBenefitDto FreeDelivery { get; init; } = new();

    /// <summary>
    /// 优先配送。
    /// </summary>
    public bool PriorityDeliveryEnabled { get; init; }

    /// <summary>
    /// 专属客服。
    /// </summary>
    public bool ExclusiveServiceEnabled { get; init; }
}

/// <summary>
/// 折扣权益 DTO。
/// </summary>
public sealed class MemberTierDiscountBenefitDto
{
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool Enabled { get; init; }

    /// <summary>
    /// 折扣值（如 9.5）。
    /// </summary>
    public decimal? DiscountRate { get; init; }
}

/// <summary>
/// 积分倍率权益 DTO。
/// </summary>
public sealed class MemberTierPointMultiplierBenefitDto
{
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool Enabled { get; init; }

    /// <summary>
    /// 倍率（如 1.5）。
    /// </summary>
    public decimal? Multiplier { get; init; }
}

/// <summary>
/// 生日特权 DTO。
/// </summary>
public sealed class MemberTierBirthdayBenefitDto
{
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool Enabled { get; init; }

    /// <summary>
    /// 是否双倍积分。
    /// </summary>
    public bool DoublePointsEnabled { get; init; }

    /// <summary>
    /// 生日赠券模板 ID。
    /// </summary>
    public IReadOnlyList<long> CouponTemplateIds { get; init; } = [];
}

/// <summary>
/// 每月赠券 DTO。
/// </summary>
public sealed class MemberTierMonthlyCouponBenefitDto
{
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool Enabled { get; init; }

    /// <summary>
    /// 每月发放日（1-28）。
    /// </summary>
    public int GrantDay { get; init; } = 1;

    /// <summary>
    /// 每月赠券模板 ID。
    /// </summary>
    public IReadOnlyList<long> CouponTemplateIds { get; init; } = [];
}

/// <summary>
/// 免配送费权益 DTO。
/// </summary>
public sealed class MemberTierFreeDeliveryBenefitDto
{
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool Enabled { get; init; }

    /// <summary>
    /// 每月免配送费次数。
    /// </summary>
    public int MonthlyFreeTimes { get; init; }
}

/// <summary>
/// 会员等级详情 DTO。
/// </summary>
public sealed class MemberTierDetailDto
{
    /// <summary>
    /// 等级标识。
    /// </summary>
    public long? TierId { get; init; }

    /// <summary>
    /// 排序序号。
    /// </summary>
    public int SortOrder { get; init; }

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

    /// <summary>
    /// 图标键。
    /// </summary>
    public string IconKey { get; init; } = string.Empty;

    /// <summary>
    /// 主题色。
    /// </summary>
    public string ColorHex { get; init; } = string.Empty;

    /// <summary>
    /// 是否默认等级。
    /// </summary>
    public bool IsDefault { get; init; }

    /// <summary>
    /// 升降级规则。
    /// </summary>
    public MemberTierRuleDto Rule { get; init; } = new();

    /// <summary>
    /// 等级权益。
    /// </summary>
    public MemberTierBenefitsDto Benefits { get; init; } = new();

    /// <summary>
    /// 是否可删除。
    /// </summary>
    public bool CanDelete { get; init; }
}

/// <summary>
/// 会员日配置 DTO。
/// </summary>
public sealed class MemberDaySettingDto
{
    /// <summary>
    /// 是否启用会员日。
    /// </summary>
    public bool IsEnabled { get; init; }

    /// <summary>
    /// 周几（1-7，对应周一到周日）。
    /// </summary>
    public int Weekday { get; init; }

    /// <summary>
    /// 会员日额外折扣（如 9 表示 9 折）。
    /// </summary>
    public decimal ExtraDiscountRate { get; init; }
}

/// <summary>
/// 优惠券选择项 DTO。
/// </summary>
public sealed class MemberCouponPickerItemDto
{
    /// <summary>
    /// 券模板标识。
    /// </summary>
    public long CouponTemplateId { get; init; }

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

    /// <summary>
    /// 券类型。
    /// </summary>
    public string CouponType { get; init; } = string.Empty;

    /// <summary>
    /// 面值或折扣值。
    /// </summary>
    public decimal Value { get; init; }

    /// <summary>
    /// 最低消费门槛。
    /// </summary>
    public decimal? MinimumSpend { get; init; }

    /// <summary>
    /// 展示文案。
    /// </summary>
    public string DisplayText { get; init; } = string.Empty;
}
