namespace TakeoutSaaS.TenantApi.Contracts.Member;

/// <summary>
/// 会员等级列表项响应。
/// </summary>
public sealed class MemberTierListItemResponse
{
    /// <summary>
    /// 等级标识。
    /// </summary>
    public string TierId { get; set; } = string.Empty;

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

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

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

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

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

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

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

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

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

/// <summary>
/// 等级详情查询请求。
/// </summary>
public sealed class MemberTierDetailRequest
{
    /// <summary>
    /// 等级标识。
    /// </summary>
    public string? TierId { get; set; }
}

/// <summary>
/// 等级规则响应。
/// </summary>
public sealed class MemberTierRuleResponse
{
    /// <summary>
    /// 升级规则类型。
    /// </summary>
    public string UpgradeRuleType { get; set; } = "none";

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

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

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

/// <summary>
/// 折扣权益响应。
/// </summary>
public sealed class MemberTierDiscountBenefitResponse
{
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool Enabled { get; set; }

    /// <summary>
    /// 折扣值。
    /// </summary>
    public decimal? DiscountRate { get; set; }
}

/// <summary>
/// 积分倍率权益响应。
/// </summary>
public sealed class MemberTierPointMultiplierBenefitResponse
{
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool Enabled { get; set; }

    /// <summary>
    /// 倍率。
    /// </summary>
    public decimal? Multiplier { get; set; }
}

/// <summary>
/// 生日特权响应。
/// </summary>
public sealed class MemberTierBirthdayBenefitResponse
{
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool Enabled { get; set; }

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

    /// <summary>
    /// 券模板 ID。
    /// </summary>
    public List<string> CouponTemplateIds { get; set; } = [];
}

/// <summary>
/// 每月赠券响应。
/// </summary>
public sealed class MemberTierMonthlyCouponBenefitResponse
{
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool Enabled { get; set; }

    /// <summary>
    /// 每月发放日。
    /// </summary>
    public int GrantDay { get; set; }

    /// <summary>
    /// 券模板 ID。
    /// </summary>
    public List<string> CouponTemplateIds { get; set; } = [];
}

/// <summary>
/// 免配送费权益响应。
/// </summary>
public sealed class MemberTierFreeDeliveryBenefitResponse
{
    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool Enabled { get; set; }

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

/// <summary>
/// 等级权益响应。
/// </summary>
public sealed class MemberTierBenefitsResponse
{
    /// <summary>
    /// 折扣权益。
    /// </summary>
    public MemberTierDiscountBenefitResponse Discount { get; set; } = new();

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

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

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

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

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

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

/// <summary>
/// 等级详情响应。
/// </summary>
public sealed class MemberTierDetailResponse
{
    /// <summary>
    /// 等级标识。
    /// </summary>
    public string? TierId { get; set; }

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

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

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

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

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

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

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

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

/// <summary>
/// 保存等级请求。
/// </summary>
public sealed class SaveMemberTierRequest
{
    /// <summary>
    /// 等级标识（为空时新增）。
    /// </summary>
    public string? TierId { get; set; }

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

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

    /// <summary>
    /// 图标键。
    /// </summary>
    public string IconKey { get; set; } = "user";

    /// <summary>
    /// 主题色。
    /// </summary>
    public string ColorHex { get; set; } = "#999999";

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

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

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

/// <summary>
/// 删除等级请求。
/// </summary>
public sealed class DeleteMemberTierRequest
{
    /// <summary>
    /// 等级标识。
    /// </summary>
    public string TierId { get; set; } = string.Empty;
}

/// <summary>
/// 会员日配置响应。
/// </summary>
public sealed class MemberDaySettingResponse
{
    /// <summary>
    /// 是否启用会员日。
    /// </summary>
    public bool IsEnabled { get; set; }

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

    /// <summary>
    /// 会员日额外折扣。
    /// </summary>
    public decimal ExtraDiscountRate { get; set; }
}

/// <summary>
/// 保存会员日配置请求。
/// </summary>
public sealed class SaveMemberDaySettingRequest
{
    /// <summary>
    /// 是否启用会员日。
    /// </summary>
    public bool IsEnabled { get; set; }

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

    /// <summary>
    /// 会员日额外折扣。
    /// </summary>
    public decimal ExtraDiscountRate { get; set; }
}

/// <summary>
/// 优惠券选择器请求。
/// </summary>
public sealed class MemberCouponPickerRequest
{
    /// <summary>
    /// 门店 ID（可选）。
    /// </summary>
    public string? StoreId { get; set; }

    /// <summary>
    /// 关键词。
    /// </summary>
    public string? Keyword { get; set; }
}

/// <summary>
/// 优惠券选择器项响应。
/// </summary>
public sealed class MemberCouponPickerItemResponse
{
    /// <summary>
    /// 券模板标识。
    /// </summary>
    public string CouponTemplateId { get; set; } = string.Empty;

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

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

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

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

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