namespace TakeoutSaaS.TenantApi.Contracts.Member;

/// <summary>
/// 积分商城规则详情查询请求。
/// </summary>
public sealed class PointMallRuleDetailRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;
}

/// <summary>
/// 保存积分商城规则请求。
/// </summary>
public sealed class SavePointMallRuleRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 是否启用消费获取。
    /// </summary>
    public bool IsConsumeRewardEnabled { get; set; }

    /// <summary>
    /// 每消费多少元触发一次积分计算。
    /// </summary>
    public int ConsumeAmountPerStep { get; set; }

    /// <summary>
    /// 每步获得积分。
    /// </summary>
    public int ConsumeRewardPointsPerStep { get; set; }

    /// <summary>
    /// 是否启用评价奖励。
    /// </summary>
    public bool IsReviewRewardEnabled { get; set; }

    /// <summary>
    /// 评价奖励积分。
    /// </summary>
    public int ReviewRewardPoints { get; set; }

    /// <summary>
    /// 是否启用注册奖励。
    /// </summary>
    public bool IsRegisterRewardEnabled { get; set; }

    /// <summary>
    /// 注册奖励积分。
    /// </summary>
    public int RegisterRewardPoints { get; set; }

    /// <summary>
    /// 是否启用签到奖励。
    /// </summary>
    public bool IsSigninRewardEnabled { get; set; }

    /// <summary>
    /// 签到奖励积分。
    /// </summary>
    public int SigninRewardPoints { get; set; }

    /// <summary>
    /// 有效期模式（permanent/yearly_clear）。
    /// </summary>
    public string ExpiryMode { get; set; } = "yearly_clear";
}

/// <summary>
/// 积分商城商品列表查询请求。
/// </summary>
public sealed class PointMallProductListRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 状态（enabled/disabled，可空）。
    /// </summary>
    public string? Status { get; set; }

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

/// <summary>
/// 积分商城商品详情查询请求。
/// </summary>
public sealed class PointMallProductDetailRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 积分商城商品 ID。
    /// </summary>
    public string PointMallProductId { get; set; } = string.Empty;
}

/// <summary>
/// 保存积分商城商品请求。
/// </summary>
public sealed class SavePointMallProductRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 积分商城商品 ID（编辑时传）。
    /// </summary>
    public string? PointMallProductId { get; set; }

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

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

    /// <summary>
    /// 兑换类型（product/coupon/physical）。
    /// </summary>
    public string RedeemType { get; set; } = "product";

    /// <summary>
    /// 关联商品 ID。
    /// </summary>
    public string? ProductId { get; set; }

    /// <summary>
    /// 关联优惠券模板 ID。
    /// </summary>
    public string? CouponTemplateId { get; set; }

    /// <summary>
    /// 实物名称。
    /// </summary>
    public string? PhysicalName { get; set; }

    /// <summary>
    /// 领取方式（store_pickup/delivery）。
    /// </summary>
    public string? PickupMethod { get; set; }

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

    /// <summary>
    /// 兑换方式（points/mixed）。
    /// </summary>
    public string ExchangeType { get; set; } = "points";

    /// <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? PerMemberLimit { get; set; }

    /// <summary>
    /// 通知渠道（in_app/sms）。
    /// </summary>
    public List<string> NotifyChannels { get; set; } = [];

    /// <summary>
    /// 状态（enabled/disabled）。
    /// </summary>
    public string Status { get; set; } = "enabled";
}

/// <summary>
/// 修改积分商城商品状态请求。
/// </summary>
public sealed class ChangePointMallProductStatusRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 积分商城商品 ID。
    /// </summary>
    public string PointMallProductId { get; set; } = string.Empty;

    /// <summary>
    /// 状态（enabled/disabled）。
    /// </summary>
    public string Status { get; set; } = "disabled";
}

/// <summary>
/// 删除积分商城商品请求。
/// </summary>
public sealed class DeletePointMallProductRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 积分商城商品 ID。
    /// </summary>
    public string PointMallProductId { get; set; } = string.Empty;
}

/// <summary>
/// 积分商城兑换记录分页查询请求。
/// </summary>
public sealed class PointMallRecordListRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 兑换类型（product/coupon/physical）。
    /// </summary>
    public string? RedeemType { get; set; }

    /// <summary>
    /// 状态（pending_pickup/issued/completed/canceled）。
    /// </summary>
    public string? Status { get; set; }

    /// <summary>
    /// 开始日期（yyyy-MM-dd）。
    /// </summary>
    public string? StartDate { get; set; }

    /// <summary>
    /// 结束日期（yyyy-MM-dd）。
    /// </summary>
    public string? EndDate { get; set; }

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

    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; } = 1;

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; } = 10;
}

/// <summary>
/// 积分商城兑换记录详情请求。
/// </summary>
public sealed class PointMallRecordDetailRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 兑换记录 ID。
    /// </summary>
    public string RecordId { get; set; } = string.Empty;
}

/// <summary>
/// 导出积分商城兑换记录请求。
/// </summary>
public sealed class ExportPointMallRecordRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 兑换类型（product/coupon/physical）。
    /// </summary>
    public string? RedeemType { get; set; }

    /// <summary>
    /// 状态（pending_pickup/issued/completed/canceled）。
    /// </summary>
    public string? Status { get; set; }

    /// <summary>
    /// 开始日期（yyyy-MM-dd）。
    /// </summary>
    public string? StartDate { get; set; }

    /// <summary>
    /// 结束日期（yyyy-MM-dd）。
    /// </summary>
    public string? EndDate { get; set; }

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

/// <summary>
/// 写入积分商城兑换记录请求。
/// </summary>
public sealed class WritePointMallRecordRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 积分商城商品 ID。
    /// </summary>
    public string PointMallProductId { get; set; } = string.Empty;

    /// <summary>
    /// 会员 ID。
    /// </summary>
    public string MemberId { get; set; } = string.Empty;

    /// <summary>
    /// 兑换时间（可空，默认当前时间）。
    /// </summary>
    public DateTime? RedeemedAt { get; set; }
}

/// <summary>
/// 核销积分商城兑换记录请求。
/// </summary>
public sealed class VerifyPointMallRecordRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 兑换记录 ID。
    /// </summary>
    public string RecordId { get; set; } = string.Empty;

    /// <summary>
    /// 核销方式（scan/manual）。
    /// </summary>
    public string VerifyMethod { get; set; } = "manual";

    /// <summary>
    /// 核销备注。
    /// </summary>
    public string? VerifyRemark { get; set; }
}

/// <summary>
/// 积分商城规则响应。
/// </summary>
public sealed class PointMallRuleResponse
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 是否启用消费获取。
    /// </summary>
    public bool IsConsumeRewardEnabled { get; set; }

    /// <summary>
    /// 每消费多少元触发一次积分计算。
    /// </summary>
    public int ConsumeAmountPerStep { get; set; }

    /// <summary>
    /// 每步获得积分。
    /// </summary>
    public int ConsumeRewardPointsPerStep { get; set; }

    /// <summary>
    /// 是否启用评价奖励。
    /// </summary>
    public bool IsReviewRewardEnabled { get; set; }

    /// <summary>
    /// 评价奖励积分。
    /// </summary>
    public int ReviewRewardPoints { get; set; }

    /// <summary>
    /// 是否启用注册奖励。
    /// </summary>
    public bool IsRegisterRewardEnabled { get; set; }

    /// <summary>
    /// 注册奖励积分。
    /// </summary>
    public int RegisterRewardPoints { get; set; }

    /// <summary>
    /// 是否启用签到奖励。
    /// </summary>
    public bool IsSigninRewardEnabled { get; set; }

    /// <summary>
    /// 签到奖励积分。
    /// </summary>
    public int SigninRewardPoints { get; set; }

    /// <summary>
    /// 有效期模式（permanent/yearly_clear）。
    /// </summary>
    public string ExpiryMode { get; set; } = "yearly_clear";
}

/// <summary>
/// 积分商城规则统计响应。
/// </summary>
public sealed class PointMallRuleStatsResponse
{
    /// <summary>
    /// 累计发放积分。
    /// </summary>
    public int TotalIssuedPoints { get; set; }

    /// <summary>
    /// 已兑换积分。
    /// </summary>
    public int RedeemedPoints { get; set; }

    /// <summary>
    /// 积分用户。
    /// </summary>
    public int PointMembers { get; set; }

    /// <summary>
    /// 兑换率（0-100）。
    /// </summary>
    public decimal RedeemRate { get; set; }
}

/// <summary>
/// 积分商城规则详情响应。
/// </summary>
public sealed class PointMallRuleDetailResultResponse
{
    /// <summary>
    /// 规则。
    /// </summary>
    public PointMallRuleResponse Rule { get; set; } = new();

    /// <summary>
    /// 统计。
    /// </summary>
    public PointMallRuleStatsResponse Stats { get; set; } = new();
}

/// <summary>
/// 积分商城商品响应。
/// </summary>
public sealed class PointMallProductResponse
{
    /// <summary>
    /// 积分商城商品 ID。
    /// </summary>
    public string PointMallProductId { get; set; } = string.Empty;

    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

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

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

    /// <summary>
    /// 兑换类型（product/coupon/physical）。
    /// </summary>
    public string RedeemType { get; set; } = "product";

    /// <summary>
    /// 兑换类型文案。
    /// </summary>
    public string RedeemTypeText { get; set; } = "商品";

    /// <summary>
    /// 关联商品 ID。
    /// </summary>
    public string? ProductId { get; set; }

    /// <summary>
    /// 关联优惠券模板 ID。
    /// </summary>
    public string? CouponTemplateId { get; set; }

    /// <summary>
    /// 实物名称。
    /// </summary>
    public string? PhysicalName { get; set; }

    /// <summary>
    /// 领取方式（store_pickup/delivery）。
    /// </summary>
    public string? PickupMethod { get; set; }

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

    /// <summary>
    /// 兑换方式（points/mixed）。
    /// </summary>
    public string ExchangeType { get; set; } = "points";

    /// <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>
    /// 已兑换数量。
    /// </summary>
    public int RedeemedCount { get; set; }

    /// <summary>
    /// 每人限兑次数。
    /// </summary>
    public int? PerMemberLimit { get; set; }

    /// <summary>
    /// 通知渠道。
    /// </summary>
    public List<string> NotifyChannels { get; set; } = [];

    /// <summary>
    /// 状态（enabled/disabled）。
    /// </summary>
    public string Status { get; set; } = "enabled";

    /// <summary>
    /// 状态文案。
    /// </summary>
    public string StatusText { get; set; } = "上架";

    /// <summary>
    /// 更新时间。
    /// </summary>
    public string UpdatedAt { get; set; } = string.Empty;
}

/// <summary>
/// 积分商城商品列表响应。
/// </summary>
public sealed class PointMallProductListResultResponse
{
    /// <summary>
    /// 列表。
    /// </summary>
    public List<PointMallProductResponse> Items { get; set; } = [];
}

/// <summary>
/// 积分商城兑换记录响应。
/// </summary>
public class PointMallRecordResponse
{
    /// <summary>
    /// 兑换记录 ID。
    /// </summary>
    public string RecordId { get; set; } = string.Empty;

    /// <summary>
    /// 兑换单号。
    /// </summary>
    public string RecordNo { get; set; } = string.Empty;

    /// <summary>
    /// 积分商城商品 ID。
    /// </summary>
    public string PointMallProductId { get; set; } = string.Empty;

    /// <summary>
    /// 商品名称。
    /// </summary>
    public string ProductName { get; set; } = string.Empty;

    /// <summary>
    /// 兑换类型（product/coupon/physical）。
    /// </summary>
    public string RedeemType { get; set; } = "product";

    /// <summary>
    /// 兑换类型文案。
    /// </summary>
    public string RedeemTypeText { get; set; } = "商品";

    /// <summary>
    /// 兑换方式（points/mixed）。
    /// </summary>
    public string ExchangeType { get; set; } = "points";

    /// <summary>
    /// 会员 ID。
    /// </summary>
    public string MemberId { get; set; } = string.Empty;

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

    /// <summary>
    /// 会员手机号（脱敏）。
    /// </summary>
    public string MemberMobileMasked { get; set; } = string.Empty;

    /// <summary>
    /// 消耗积分。
    /// </summary>
    public int UsedPoints { get; set; }

    /// <summary>
    /// 现金部分。
    /// </summary>
    public decimal CashAmount { get; set; }

    /// <summary>
    /// 状态（pending_pickup/issued/completed/canceled）。
    /// </summary>
    public string Status { get; set; } = "issued";

    /// <summary>
    /// 状态文案。
    /// </summary>
    public string StatusText { get; set; } = "已发放";

    /// <summary>
    /// 兑换时间。
    /// </summary>
    public string RedeemedAt { get; set; } = string.Empty;

    /// <summary>
    /// 发放时间。
    /// </summary>
    public string? IssuedAt { get; set; }

    /// <summary>
    /// 核销时间。
    /// </summary>
    public string? VerifiedAt { get; set; }
}

/// <summary>
/// 积分商城兑换记录详情响应。
/// </summary>
public sealed class PointMallRecordDetailResponse : PointMallRecordResponse
{
    /// <summary>
    /// 核销方式（scan/manual）。
    /// </summary>
    public string? VerifyMethod { get; set; }

    /// <summary>
    /// 核销方式文案。
    /// </summary>
    public string? VerifyMethodText { get; set; }

    /// <summary>
    /// 核销备注。
    /// </summary>
    public string? VerifyRemark { get; set; }

    /// <summary>
    /// 核销人 ID。
    /// </summary>
    public string? VerifiedBy { get; set; }
}

/// <summary>
/// 积分商城兑换记录统计响应。
/// </summary>
public sealed class PointMallRecordStatsResponse
{
    /// <summary>
    /// 今日兑换。
    /// </summary>
    public int TodayRedeemCount { get; set; }

    /// <summary>
    /// 待领取实物。
    /// </summary>
    public int PendingPhysicalCount { get; set; }

    /// <summary>
    /// 本月消耗积分。
    /// </summary>
    public int CurrentMonthUsedPoints { get; set; }
}

/// <summary>
/// 积分商城兑换记录分页响应。
/// </summary>
public sealed class PointMallRecordListResultResponse
{
    /// <summary>
    /// 列表。
    /// </summary>
    public List<PointMallRecordResponse> Items { get; set; } = [];

    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; }

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; }

    /// <summary>
    /// 总条数。
    /// </summary>
    public int TotalCount { get; set; }

    /// <summary>
    /// 统计。
    /// </summary>
    public PointMallRecordStatsResponse Stats { get; set; } = new();
}

/// <summary>
/// 积分商城兑换记录导出响应。
/// </summary>
public sealed class PointMallRecordExportResponse
{
    /// <summary>
    /// 文件名。
    /// </summary>
    public string FileName { get; set; } = string.Empty;

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

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