namespace TakeoutSaaS.TenantApi.Contracts.Customer;

/// <summary>
/// 客户列表筛选请求。
/// </summary>
public class CustomerListFilterRequest
{
    /// <summary>
    /// 门店 ID（可选，未传表示当前商户全部可见门店）。
    /// </summary>
    public string? StoreId { get; set; }

    /// <summary>
    /// 关键词（姓名/手机号）。
    /// </summary>
    public string? Keyword { get; set; }

    /// <summary>
    /// 客户标签（high_value/active/dormant/churn/new_customer）。
    /// </summary>
    public string? Tag { get; set; }

    /// <summary>
    /// 下单次数区间（once/two_to_five/six_to_ten/ten_plus）。
    /// </summary>
    public string? OrderCountRange { get; set; }

    /// <summary>
    /// 注册周期（7/30/90 或 7d/30d/90d）。
    /// </summary>
    public string? RegisterPeriod { get; set; }
}

/// <summary>
/// 客户列表分页请求。
/// </summary>
public sealed class CustomerListRequest : CustomerListFilterRequest
{
    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; } = 1;

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

/// <summary>
/// 客户详情请求。
/// </summary>
public sealed class CustomerDetailRequest
{
    /// <summary>
    /// 门店 ID（可选，未传表示当前商户全部可见门店）。
    /// </summary>
    public string? StoreId { get; set; }

    /// <summary>
    /// 客户标识（手机号归一化）。
    /// </summary>
    public string CustomerKey { get; set; } = string.Empty;
}

/// <summary>
/// 客户画像请求。
/// </summary>
public sealed class CustomerProfileRequest
{
    /// <summary>
    /// 门店 ID（可选，未传表示当前商户全部可见门店）。
    /// </summary>
    public string? StoreId { get; set; }

    /// <summary>
    /// 客户标识（手机号归一化）。
    /// </summary>
    public string CustomerKey { get; set; } = string.Empty;
}

/// <summary>
/// 客户标签响应。
/// </summary>
public sealed class CustomerTagResponse
{
    /// <summary>
    /// 标签编码。
    /// </summary>
    public string Code { get; set; } = string.Empty;

    /// <summary>
    /// 标签文案。
    /// </summary>
    public string Label { get; set; } = string.Empty;

    /// <summary>
    /// 标签色调（orange/blue/green/gray/red）。
    /// </summary>
    public string Tone { get; set; } = "blue";
}

/// <summary>
/// 客户列表行响应。
/// </summary>
public sealed class CustomerListItemResponse
{
    /// <summary>
    /// 客户标识（手机号归一化）。
    /// </summary>
    public string CustomerKey { get; set; } = string.Empty;

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

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

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

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

    /// <summary>
    /// 下单次数。
    /// </summary>
    public int OrderCount { get; set; }

    /// <summary>
    /// 下单次数条形宽度百分比。
    /// </summary>
    public int OrderCountBarPercent { get; set; }

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

    /// <summary>
    /// 客单价。
    /// </summary>
    public decimal AverageAmount { get; set; }

    /// <summary>
    /// 最近下单时间（yyyy-MM-dd）。
    /// </summary>
    public string LastOrderAt { get; set; } = string.Empty;

    /// <summary>
    /// 客户标签。
    /// </summary>
    public List<CustomerTagResponse> Tags { get; set; } = [];

    /// <summary>
    /// 是否弱化展示。
    /// </summary>
    public bool IsDimmed { get; set; }
}

/// <summary>
/// 客户列表响应。
/// </summary>
public sealed class CustomerListResultResponse
{
    /// <summary>
    /// 列表项。
    /// </summary>
    public List<CustomerListItemResponse> Items { get; set; } = [];

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

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

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

/// <summary>
/// 客户列表统计响应。
/// </summary>
public sealed class CustomerListStatsResponse
{
    /// <summary>
    /// 客户总数。
    /// </summary>
    public int TotalCustomers { get; set; }

    /// <summary>
    /// 本月新增客户数。
    /// </summary>
    public int MonthlyNewCustomers { get; set; }

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

    /// <summary>
    /// 活跃客户数（近 30 天有下单）。
    /// </summary>
    public int ActiveCustomers { get; set; }

    /// <summary>
    /// 近 30 天客均消费（按订单均值）。
    /// </summary>
    public decimal AverageAmountLast30Days { get; set; }
}

/// <summary>
/// 客户偏好响应。
/// </summary>
public sealed class CustomerPreferenceResponse
{
    /// <summary>
    /// 偏好品类。
    /// </summary>
    public List<string> PreferredCategories { get; set; } = [];

    /// <summary>
    /// 偏好下单时段。
    /// </summary>
    public string PreferredOrderPeaks { get; set; } = string.Empty;

    /// <summary>
    /// 偏好履约方式。
    /// </summary>
    public string PreferredDelivery { get; set; } = string.Empty;

    /// <summary>
    /// 偏好支付方式。
    /// </summary>
    public string PreferredPaymentMethod { get; set; } = string.Empty;

    /// <summary>
    /// 平均配送距离文案（当前无配送距离数据时返回空字符串）。
    /// </summary>
    public string AverageDeliveryDistance { get; set; } = string.Empty;
}

/// <summary>
/// 客户常购商品响应。
/// </summary>
public sealed class CustomerTopProductResponse
{
    /// <summary>
    /// 排名。
    /// </summary>
    public int Rank { get; set; }

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

    /// <summary>
    /// 购买次数。
    /// </summary>
    public int Count { get; set; }

    /// <summary>
    /// 占比（0-100）。
    /// </summary>
    public decimal ProportionPercent { get; set; }
}

/// <summary>
/// 客户月度趋势响应。
/// </summary>
public sealed class CustomerTrendPointResponse
{
    /// <summary>
    /// 月份标签。
    /// </summary>
    public string Label { get; set; } = string.Empty;

    /// <summary>
    /// 消费金额。
    /// </summary>
    public decimal Amount { get; set; }
}

/// <summary>
/// 客户最近订单响应。
/// </summary>
public sealed class CustomerRecentOrderResponse
{
    /// <summary>
    /// 订单号。
    /// </summary>
    public string OrderNo { get; set; } = string.Empty;

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

    /// <summary>
    /// 商品摘要。
    /// </summary>
    public string ItemsSummary { get; set; } = string.Empty;

    /// <summary>
    /// 履约方式。
    /// </summary>
    public string DeliveryType { get; set; } = string.Empty;

    /// <summary>
    /// 订单状态。
    /// </summary>
    public string Status { get; set; } = string.Empty;

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

/// <summary>
/// 客户会员摘要响应。
/// </summary>
public sealed class CustomerMemberSummaryResponse
{
    /// <summary>
    /// 是否会员。
    /// </summary>
    public bool IsMember { get; set; }

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

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

    /// <summary>
    /// 成长值。
    /// </summary>
    public int GrowthValue { get; set; }

    /// <summary>
    /// 入会时间（yyyy-MM-dd）。
    /// </summary>
    public string JoinedAt { get; set; } = string.Empty;
}

/// <summary>
/// 客户详情响应。
/// </summary>
public sealed class CustomerDetailResponse
{
    /// <summary>
    /// 客户标识。
    /// </summary>
    public string CustomerKey { get; set; } = string.Empty;

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

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

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

    /// <summary>
    /// 首次下单时间（yyyy-MM-dd）。
    /// </summary>
    public string FirstOrderAt { get; set; } = string.Empty;

    /// <summary>
    /// 客户来源。
    /// </summary>
    public string Source { get; set; } = string.Empty;

    /// <summary>
    /// 客户标签。
    /// </summary>
    public List<CustomerTagResponse> Tags { get; set; } = [];

    /// <summary>
    /// 会员摘要。
    /// </summary>
    public CustomerMemberSummaryResponse Member { get; set; } = new();

    /// <summary>
    /// 累计下单次数。
    /// </summary>
    public int TotalOrders { get; set; }

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

    /// <summary>
    /// 客单价。
    /// </summary>
    public decimal AverageAmount { get; set; }

    /// <summary>
    /// 复购率（百分比）。
    /// </summary>
    public decimal RepurchaseRatePercent { get; set; }

    /// <summary>
    /// 消费偏好。
    /// </summary>
    public CustomerPreferenceResponse Preference { get; set; } = new();

    /// <summary>
    /// 常购商品 Top 5。
    /// </summary>
    public List<CustomerTopProductResponse> TopProducts { get; set; } = [];

    /// <summary>
    /// 近 6 月消费趋势。
    /// </summary>
    public List<CustomerTrendPointResponse> Trend { get; set; } = [];

    /// <summary>
    /// 最近订单（最多 3 条）。
    /// </summary>
    public List<CustomerRecentOrderResponse> RecentOrders { get; set; } = [];
}

/// <summary>
/// 客户画像响应。
/// </summary>
public sealed class CustomerProfileResponse
{
    /// <summary>
    /// 客户标识。
    /// </summary>
    public string CustomerKey { get; set; } = string.Empty;

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

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

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

    /// <summary>
    /// 首次下单时间（yyyy-MM-dd）。
    /// </summary>
    public string FirstOrderAt { get; set; } = string.Empty;

    /// <summary>
    /// 客户来源。
    /// </summary>
    public string Source { get; set; } = string.Empty;

    /// <summary>
    /// 客户标签。
    /// </summary>
    public List<CustomerTagResponse> Tags { get; set; } = [];

    /// <summary>
    /// 会员摘要。
    /// </summary>
    public CustomerMemberSummaryResponse Member { get; set; } = new();

    /// <summary>
    /// 累计下单次数。
    /// </summary>
    public int TotalOrders { get; set; }

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

    /// <summary>
    /// 客单价。
    /// </summary>
    public decimal AverageAmount { get; set; }

    /// <summary>
    /// 复购率（百分比）。
    /// </summary>
    public decimal RepurchaseRatePercent { get; set; }

    /// <summary>
    /// 平均下单间隔（天）。
    /// </summary>
    public decimal AverageOrderIntervalDays { get; set; }

    /// <summary>
    /// 消费偏好。
    /// </summary>
    public CustomerPreferenceResponse Preference { get; set; } = new();

    /// <summary>
    /// 常购商品 Top 5。
    /// </summary>
    public List<CustomerTopProductResponse> TopProducts { get; set; } = [];

    /// <summary>
    /// 近 12 月消费趋势。
    /// </summary>
    public List<CustomerTrendPointResponse> Trend { get; set; } = [];

    /// <summary>
    /// 最近订单（最多 5 条）。
    /// </summary>
    public List<CustomerRecentOrderResponse> RecentOrders { get; set; } = [];
}

/// <summary>
/// 客户导出响应。
/// </summary>
public sealed class CustomerExportResponse
{
    /// <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; }
}
