using TakeoutSaaS.Domain.Membership.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;

namespace TakeoutSaaS.Domain.Membership.Entities;

/// <summary>
/// 会员积分商城兑换商品。
/// </summary>
public sealed class MemberPointMallProduct : MultiTenantEntityBase
{
    /// <summary>
    /// 门店标识。
    /// </summary>
    public long StoreId { get; set; }

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

    /// <summary>
    /// 展示图片地址。
    /// </summary>
    public string? ImageUrl { get; set; }

    /// <summary>
    /// 兑换类型。
    /// </summary>
    public MemberPointMallRedeemType RedeemType { get; set; } = MemberPointMallRedeemType.Product;

    /// <summary>
    /// 关联商品 ID（兑换商品时必填）。
    /// </summary>
    public long? ProductId { get; set; }

    /// <summary>
    /// 关联优惠券模板 ID（兑换优惠券时必填）。
    /// </summary>
    public long? CouponTemplateId { get; set; }

    /// <summary>
    /// 实物名称（兑换实物时必填）。
    /// </summary>
    public string? PhysicalName { get; set; }

    /// <summary>
    /// 实物领取方式。
    /// </summary>
    public MemberPointMallPickupMethod? PickupMethod { get; set; }

    /// <summary>
    /// 商品描述。
    /// </summary>
    public string? Description { get; set; }

    /// <summary>
    /// 兑换方式（纯积分/积分+现金）。
    /// </summary>
    public MemberPointMallExchangeType ExchangeType { get; set; } = MemberPointMallExchangeType.PointsOnly;

    /// <summary>
    /// 所需积分。
    /// </summary>
    public int RequiredPoints { get; set; }

    /// <summary>
    /// 现金部分（积分+现金时使用）。
    /// </summary>
    public decimal CashAmount { get; set; }

    /// <summary>
    /// 初始库存数量。
    /// </summary>
    public int StockTotal { get; set; }

    /// <summary>
    /// 剩余库存数量。
    /// </summary>
    public int StockAvailable { get; set; }

    /// <summary>
    /// 每人限兑次数（null 表示不限）。
    /// </summary>
    public int? PerMemberLimit { get; set; }

    /// <summary>
    /// 到账通知渠道（JSON 数组）。
    /// </summary>
    public string NotifyChannelsJson { get; set; } = "[]";

    /// <summary>
    /// 上下架状态。
    /// </summary>
    public MemberPointMallProductStatus Status { get; set; } = MemberPointMallProductStatus.Enabled;
}
