namespace TakeoutSaaS.TenantApi.Contracts.Marketing;

/// <summary>
/// 新客有礼详情请求。
/// </summary>
public sealed class NewCustomerDetailRequest
{
    /// <summary>
    /// 操作门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 邀请记录页码。
    /// </summary>
    public int RecordPage { get; set; } = 1;

    /// <summary>
    /// 邀请记录每页条数。
    /// </summary>
    public int RecordPageSize { get; set; } = 10;
}

/// <summary>
/// 新客有礼配置保存请求。
/// </summary>
public sealed class SaveNewCustomerSettingsRequest
{
    /// <summary>
    /// 操作门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 是否开启新客礼包。
    /// </summary>
    public bool GiftEnabled { get; set; }

    /// <summary>
    /// 礼包类型（coupon/direct）。
    /// </summary>
    public string GiftType { get; set; } = "coupon";

    /// <summary>
    /// 首单直减金额。
    /// </summary>
    public decimal? DirectReduceAmount { get; set; }

    /// <summary>
    /// 首单直减门槛金额。
    /// </summary>
    public decimal? DirectMinimumSpend { get; set; }

    /// <summary>
    /// 是否开启老带新分享。
    /// </summary>
    public bool InviteEnabled { get; set; }

    /// <summary>
    /// 分享渠道（wechat_friend/moments/sms）。
    /// </summary>
    public List<string> ShareChannels { get; set; } = [];

    /// <summary>
    /// 新客礼包券列表。
    /// </summary>
    public List<NewCustomerSaveCouponRuleRequest> WelcomeCoupons { get; set; } = [];

    /// <summary>
    /// 邀请人奖励券列表。
    /// </summary>
    public List<NewCustomerSaveCouponRuleRequest> InviterCoupons { get; set; } = [];

    /// <summary>
    /// 被邀请人奖励券列表。
    /// </summary>
    public List<NewCustomerSaveCouponRuleRequest> InviteeCoupons { get; set; } = [];
}

/// <summary>
/// 新客邀请记录分页请求。
/// </summary>
public sealed class NewCustomerInviteRecordListRequest
{
    /// <summary>
    /// 操作门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

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

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

/// <summary>
/// 写入新客邀请记录请求。
/// </summary>
public sealed class WriteNewCustomerInviteRecordRequest
{
    /// <summary>
    /// 操作门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 邀请人展示名。
    /// </summary>
    public string InviterName { get; set; } = string.Empty;

    /// <summary>
    /// 被邀请人展示名。
    /// </summary>
    public string InviteeName { get; set; } = string.Empty;

    /// <summary>
    /// 邀请时间。
    /// </summary>
    public DateTime InviteTime { get; set; }

    /// <summary>
    /// 订单状态（pending_order/ordered）。
    /// </summary>
    public string OrderStatus { get; set; } = "pending_order";

    /// <summary>
    /// 奖励状态（pending/issued）。
    /// </summary>
    public string RewardStatus { get; set; } = "pending";

    /// <summary>
    /// 奖励发放时间。
    /// </summary>
    public DateTime? RewardIssuedAt { get; set; }

    /// <summary>
    /// 来源渠道。
    /// </summary>
    public string? SourceChannel { get; set; }
}

/// <summary>
/// 写入新客成长记录请求。
/// </summary>
public sealed class WriteNewCustomerGrowthRecordRequest
{
    /// <summary>
    /// 操作门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 顾客业务唯一键。
    /// </summary>
    public string CustomerKey { get; set; } = string.Empty;

    /// <summary>
    /// 顾客展示名。
    /// </summary>
    public string? CustomerName { get; set; }

    /// <summary>
    /// 注册时间。
    /// </summary>
    public DateTime RegisteredAt { get; set; }

    /// <summary>
    /// 礼包领取时间。
    /// </summary>
    public DateTime? GiftClaimedAt { get; set; }

    /// <summary>
    /// 首单时间。
    /// </summary>
    public DateTime? FirstOrderAt { get; set; }

    /// <summary>
    /// 来源渠道。
    /// </summary>
    public string? SourceChannel { get; set; }
}

/// <summary>
/// 保存优惠券规则请求项。
/// </summary>
public sealed class NewCustomerSaveCouponRuleRequest
{
    /// <summary>
    /// 券类型（amount_off/discount/free_shipping）。
    /// </summary>
    public string CouponType { get; set; } = "amount_off";

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

    /// <summary>
    /// 使用门槛金额。
    /// </summary>
    public decimal? MinimumSpend { get; set; }

    /// <summary>
    /// 有效期天数。
    /// </summary>
    public int ValidDays { get; set; }
}

/// <summary>
/// 新客有礼详情响应。
/// </summary>
public sealed class NewCustomerDetailResponse
{
    /// <summary>
    /// 配置详情。
    /// </summary>
    public NewCustomerSettingsResponse Settings { get; set; } = new();

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

    /// <summary>
    /// 邀请记录分页。
    /// </summary>
    public NewCustomerInviteRecordListResultResponse InviteRecords { get; set; } = new();
}

/// <summary>
/// 新客有礼配置响应。
/// </summary>
public sealed class NewCustomerSettingsResponse
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 是否开启新客礼包。
    /// </summary>
    public bool GiftEnabled { get; set; }

    /// <summary>
    /// 礼包类型（coupon/direct）。
    /// </summary>
    public string GiftType { get; set; } = "coupon";

    /// <summary>
    /// 首单直减金额。
    /// </summary>
    public decimal? DirectReduceAmount { get; set; }

    /// <summary>
    /// 首单直减门槛金额。
    /// </summary>
    public decimal? DirectMinimumSpend { get; set; }

    /// <summary>
    /// 是否开启老带新分享。
    /// </summary>
    public bool InviteEnabled { get; set; }

    /// <summary>
    /// 分享渠道（wechat_friend/moments/sms）。
    /// </summary>
    public List<string> ShareChannels { get; set; } = [];

    /// <summary>
    /// 新客礼包券列表。
    /// </summary>
    public List<NewCustomerCouponRuleResponse> WelcomeCoupons { get; set; } = [];

    /// <summary>
    /// 邀请人奖励券列表。
    /// </summary>
    public List<NewCustomerCouponRuleResponse> InviterCoupons { get; set; } = [];

    /// <summary>
    /// 被邀请人奖励券列表。
    /// </summary>
    public List<NewCustomerCouponRuleResponse> InviteeCoupons { get; set; } = [];

    /// <summary>
    /// 更新时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string UpdatedAt { get; set; } = string.Empty;
}

/// <summary>
/// 新客有礼统计响应。
/// </summary>
public sealed class NewCustomerStatsResponse
{
    /// <summary>
    /// 本月新客数。
    /// </summary>
    public int MonthlyNewCustomers { get; set; }

    /// <summary>
    /// 较上月增长人数。
    /// </summary>
    public int MonthlyGrowthCount { get; set; }

    /// <summary>
    /// 较上月增长百分比。
    /// </summary>
    public decimal MonthlyGrowthRatePercent { get; set; }

    /// <summary>
    /// 本月礼包领取率（百分比）。
    /// </summary>
    public decimal GiftClaimRate { get; set; }

    /// <summary>
    /// 本月礼包已领取人数。
    /// </summary>
    public int GiftClaimedCount { get; set; }

    /// <summary>
    /// 本月首单转化率（百分比）。
    /// </summary>
    public decimal FirstOrderConversionRate { get; set; }

    /// <summary>
    /// 本月首单完成人数。
    /// </summary>
    public int FirstOrderedCount { get; set; }
}

/// <summary>
/// 邀请记录分页结果响应。
/// </summary>
public sealed class NewCustomerInviteRecordListResultResponse
{
    /// <summary>
    /// 列表项。
    /// </summary>
    public List<NewCustomerInviteRecordResponse> 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 sealed class NewCustomerInviteRecordResponse
{
    /// <summary>
    /// 记录 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

    /// <summary>
    /// 邀请人展示名。
    /// </summary>
    public string InviterName { get; set; } = string.Empty;

    /// <summary>
    /// 被邀请人展示名。
    /// </summary>
    public string InviteeName { get; set; } = string.Empty;

    /// <summary>
    /// 邀请时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string InviteTime { get; set; } = string.Empty;

    /// <summary>
    /// 订单状态（pending_order/ordered）。
    /// </summary>
    public string OrderStatus { get; set; } = "pending_order";

    /// <summary>
    /// 奖励状态（pending/issued）。
    /// </summary>
    public string RewardStatus { get; set; } = "pending";

    /// <summary>
    /// 奖励发放时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string? RewardIssuedAt { get; set; }

    /// <summary>
    /// 来源渠道。
    /// </summary>
    public string? SourceChannel { get; set; }
}

/// <summary>
/// 新客成长记录响应。
/// </summary>
public sealed class NewCustomerGrowthRecordResponse
{
    /// <summary>
    /// 记录 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

    /// <summary>
    /// 顾客业务唯一键。
    /// </summary>
    public string CustomerKey { get; set; } = string.Empty;

    /// <summary>
    /// 顾客展示名。
    /// </summary>
    public string? CustomerName { get; set; }

    /// <summary>
    /// 注册时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string RegisteredAt { get; set; } = string.Empty;

    /// <summary>
    /// 礼包领取时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string? GiftClaimedAt { get; set; }

    /// <summary>
    /// 首单时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string? FirstOrderAt { get; set; }

    /// <summary>
    /// 来源渠道。
    /// </summary>
    public string? SourceChannel { get; set; }
}

/// <summary>
/// 新客券规则响应。
/// </summary>
public sealed class NewCustomerCouponRuleResponse
{
    /// <summary>
    /// 规则 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

    /// <summary>
    /// 场景（welcome/inviter/invitee）。
    /// </summary>
    public string Scene { get; set; } = "welcome";

    /// <summary>
    /// 券类型（amount_off/discount/free_shipping）。
    /// </summary>
    public string CouponType { get; set; } = "amount_off";

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

    /// <summary>
    /// 使用门槛金额。
    /// </summary>
    public decimal? MinimumSpend { get; set; }

    /// <summary>
    /// 有效期天数。
    /// </summary>
    public int ValidDays { get; set; }

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