namespace TakeoutSaaS.TenantApi.Contracts.Customer;

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

    /// <summary>
    /// 统计周期（7d/30d/90d/365d）。
    /// </summary>
    public string? Period { get; set; }
}

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

    /// <summary>
    /// 统计周期（7d/30d/90d/365d）。
    /// </summary>
    public string? Period { get; set; }

    /// <summary>
    /// 分群编码。
    /// </summary>
    public string SegmentCode { get; set; } = "all";

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

/// <summary>
/// 客群明细分页请求。
/// </summary>
public sealed class CustomerAnalysisSegmentListRequest : CustomerAnalysisSegmentFilterRequest
{
    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; } = 1;

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

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

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

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

    /// <summary>
    /// 统计周期（7d/30d/90d/365d）。
    /// </summary>
    public string? Period { get; set; }
}

/// <summary>
/// 客户分析趋势点响应。
/// </summary>
public sealed class CustomerAnalysisTrendPointResponse
{
    /// <summary>
    /// 维度标签。
    /// </summary>
    public string Label { get; set; } = string.Empty;

    /// <summary>
    /// 数量值。
    /// </summary>
    public int Value { get; set; }
}

/// <summary>
/// 新老客构成项响应。
/// </summary>
public sealed class CustomerAnalysisCompositionItemResponse
{
    /// <summary>
    /// 分群编码。
    /// </summary>
    public string SegmentCode { get; set; } = string.Empty;

    /// <summary>
    /// 分群名称。
    /// </summary>
    public string Label { get; set; } = string.Empty;

    /// <summary>
    /// 人数。
    /// </summary>
    public int Count { get; set; }

    /// <summary>
    /// 占比（百分比）。
    /// </summary>
    public decimal Percent { get; set; }

    /// <summary>
    /// 色调。
    /// </summary>
    public string Tone { get; set; } = "blue";
}

/// <summary>
/// 客单价分布项响应。
/// </summary>
public sealed class CustomerAnalysisAmountDistributionItemResponse
{
    /// <summary>
    /// 分群编码。
    /// </summary>
    public string SegmentCode { get; set; } = string.Empty;

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

    /// <summary>
    /// 人数。
    /// </summary>
    public int Count { get; set; }

    /// <summary>
    /// 占比（百分比）。
    /// </summary>
    public decimal Percent { get; set; }
}

/// <summary>
/// RFM 分层单元响应。
/// </summary>
public sealed class CustomerAnalysisRfmCellResponse
{
    /// <summary>
    /// 分群编码。
    /// </summary>
    public string SegmentCode { get; set; } = string.Empty;

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

    /// <summary>
    /// 人数。
    /// </summary>
    public int Count { get; set; }

    /// <summary>
    /// 温度（hot/warm/cool/cold）。
    /// </summary>
    public string Tone { get; set; } = "cold";
}

/// <summary>
/// RFM 分层行响应。
/// </summary>
public sealed class CustomerAnalysisRfmRowResponse
{
    /// <summary>
    /// 行标签。
    /// </summary>
    public string Label { get; set; } = string.Empty;

    /// <summary>
    /// 单元格集合。
    /// </summary>
    public List<CustomerAnalysisRfmCellResponse> Cells { get; set; } = [];
}

/// <summary>
/// 高价值客户响应。
/// </summary>
public sealed class CustomerAnalysisTopCustomerResponse
{
    /// <summary>
    /// 排名。
    /// </summary>
    public int Rank { get; set; }

    /// <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 decimal TotalAmount { get; set; }

    /// <summary>
    /// 下单次数。
    /// </summary>
    public int OrderCount { 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 sealed class CustomerAnalysisOverviewResponse
{
    /// <summary>
    /// 统计周期编码。
    /// </summary>
    public string PeriodCode { get; set; } = "30d";

    /// <summary>
    /// 统计周期天数。
    /// </summary>
    public int PeriodDays { get; set; } = 30;

    /// <summary>
    /// 客户总数。
    /// </summary>
    public int TotalCustomers { get; set; }

    /// <summary>
    /// 周期新增客户数。
    /// </summary>
    public int NewCustomers { get; set; }

    /// <summary>
    /// 新增较上一周期增长百分比。
    /// </summary>
    public decimal GrowthRatePercent { get; set; }

    /// <summary>
    /// 周期内日均新增客户。
    /// </summary>
    public decimal NewCustomersDailyAverage { get; set; }

    /// <summary>
    /// 活跃客户数。
    /// </summary>
    public int ActiveCustomers { get; set; }

    /// <summary>
    /// 活跃率（百分比）。
    /// </summary>
    public decimal ActiveRatePercent { get; set; }

    /// <summary>
    /// 平均客户价值。
    /// </summary>
    public decimal AverageLifetimeValue { get; set; }

    /// <summary>
    /// 客户增长趋势。
    /// </summary>
    public List<CustomerAnalysisTrendPointResponse> GrowthTrend { get; set; } = [];

    /// <summary>
    /// 新老客占比。
    /// </summary>
    public List<CustomerAnalysisCompositionItemResponse> Composition { get; set; } = [];

    /// <summary>
    /// 客单价分布。
    /// </summary>
    public List<CustomerAnalysisAmountDistributionItemResponse> AmountDistribution { get; set; } = [];

    /// <summary>
    /// RFM 分层。
    /// </summary>
    public List<CustomerAnalysisRfmRowResponse> RfmRows { get; set; } = [];

    /// <summary>
    /// 高价值客户 Top10。
    /// </summary>
    public List<CustomerAnalysisTopCustomerResponse> TopCustomers { get; set; } = [];
}

/// <summary>
/// 客群明细行响应。
/// </summary>
public sealed class CustomerAnalysisSegmentListItemResponse
{
    /// <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 List<CustomerTagResponse> Tags { get; set; } = [];

    /// <summary>
    /// 是否会员。
    /// </summary>
    public bool IsMember { get; set; }

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

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

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

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

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

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

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

/// <summary>
/// 客群明细分页响应。
/// </summary>
public sealed class CustomerAnalysisSegmentListResultResponse
{
    /// <summary>
    /// 分群编码。
    /// </summary>
    public string SegmentCode { get; set; } = string.Empty;

    /// <summary>
    /// 分群标题。
    /// </summary>
    public string SegmentTitle { get; set; } = string.Empty;

    /// <summary>
    /// 分群说明。
    /// </summary>
    public string SegmentDescription { get; set; } = string.Empty;

    /// <summary>
    /// 列表项。
    /// </summary>
    public List<CustomerAnalysisSegmentListItemResponse> 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 CustomerMemberDetailResponse
{
    /// <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 Source { get; set; } = string.Empty;

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

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

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

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

    /// <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 List<CustomerRecentOrderResponse> RecentOrders { get; set; } = [];
}
