namespace TakeoutSaaS.Application.App.Finance.Overview.Dto;

/// <summary>
/// 财务概览指标卡 DTO。
/// </summary>
public sealed class FinanceOverviewKpiCardDto
{
    /// <summary>
    /// 指标值。
    /// </summary>
    public decimal Amount { get; set; }

    /// <summary>
    /// 对比基准值。
    /// </summary>
    public decimal CompareAmount { get; set; }

    /// <summary>
    /// 变化率（%）。
    /// </summary>
    public decimal ChangeRate { get; set; }

    /// <summary>
    /// 趋势（up/down/flat）。
    /// </summary>
    public string Trend { get; set; } = "flat";

    /// <summary>
    /// 对比文案（较昨日/较上周）。
    /// </summary>
    public string CompareLabel { get; set; } = "较昨日";
}

/// <summary>
/// 收入趋势点 DTO。
/// </summary>
public sealed class FinanceOverviewIncomeTrendPointDto
{
    /// <summary>
    /// 日期（yyyy-MM-dd）。
    /// </summary>
    public string Date { get; set; } = string.Empty;

    /// <summary>
    /// 轴标签（MM/dd）。
    /// </summary>
    public string DateLabel { get; set; } = string.Empty;

    /// <summary>
    /// 实收金额。
    /// </summary>
    public decimal Amount { get; set; }
}

/// <summary>
/// 收入趋势 DTO。
/// </summary>
public sealed class FinanceOverviewIncomeTrendDto
{
    /// <summary>
    /// 近 7 天。
    /// </summary>
    public List<FinanceOverviewIncomeTrendPointDto> Last7Days { get; set; } = [];

    /// <summary>
    /// 近 30 天。
    /// </summary>
    public List<FinanceOverviewIncomeTrendPointDto> Last30Days { get; set; } = [];
}

/// <summary>
/// 利润趋势点 DTO。
/// </summary>
public sealed class FinanceOverviewProfitTrendPointDto
{
    /// <summary>
    /// 日期（yyyy-MM-dd）。
    /// </summary>
    public string Date { get; set; } = string.Empty;

    /// <summary>
    /// 轴标签（MM/dd）。
    /// </summary>
    public string DateLabel { get; set; } = string.Empty;

    /// <summary>
    /// 营收。
    /// </summary>
    public decimal RevenueAmount { get; set; }

    /// <summary>
    /// 成本。
    /// </summary>
    public decimal CostAmount { get; set; }

    /// <summary>
    /// 净利润。
    /// </summary>
    public decimal NetProfitAmount { get; set; }
}

/// <summary>
/// 利润趋势 DTO。
/// </summary>
public sealed class FinanceOverviewProfitTrendDto
{
    /// <summary>
    /// 近 7 天。
    /// </summary>
    public List<FinanceOverviewProfitTrendPointDto> Last7Days { get; set; } = [];

    /// <summary>
    /// 近 30 天。
    /// </summary>
    public List<FinanceOverviewProfitTrendPointDto> Last30Days { get; set; } = [];
}

/// <summary>
/// 收入构成项 DTO。
/// </summary>
public sealed class FinanceOverviewIncomeCompositionItemDto
{
    /// <summary>
    /// 渠道编码（delivery/pickup/dine_in）。
    /// </summary>
    public string Channel { get; set; } = string.Empty;

    /// <summary>
    /// 渠道文案。
    /// </summary>
    public string ChannelText { get; set; } = string.Empty;

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

    /// <summary>
    /// 占比（%）。
    /// </summary>
    public decimal Percentage { get; set; }
}

/// <summary>
/// 收入构成 DTO。
/// </summary>
public sealed class FinanceOverviewIncomeCompositionDto
{
    /// <summary>
    /// 总实收。
    /// </summary>
    public decimal TotalAmount { get; set; }

    /// <summary>
    /// 构成项。
    /// </summary>
    public List<FinanceOverviewIncomeCompositionItemDto> Items { get; set; } = [];
}

/// <summary>
/// 成本构成项 DTO。
/// </summary>
public sealed class FinanceOverviewCostCompositionItemDto
{
    /// <summary>
    /// 分类编码（food/labor/fixed/packaging/platform）。
    /// </summary>
    public string Category { get; set; } = string.Empty;

    /// <summary>
    /// 分类文案。
    /// </summary>
    public string CategoryText { get; set; } = string.Empty;

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

    /// <summary>
    /// 占比（%）。
    /// </summary>
    public decimal Percentage { get; set; }
}

/// <summary>
/// 成本构成 DTO。
/// </summary>
public sealed class FinanceOverviewCostCompositionDto
{
    /// <summary>
    /// 总成本。
    /// </summary>
    public decimal TotalAmount { get; set; }

    /// <summary>
    /// 构成项。
    /// </summary>
    public List<FinanceOverviewCostCompositionItemDto> Items { get; set; } = [];
}

/// <summary>
/// TOP 商品 DTO。
/// </summary>
public sealed class FinanceOverviewTopProductItemDto
{
    /// <summary>
    /// 排名。
    /// </summary>
    public int Rank { get; set; }

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

    /// <summary>
    /// 销量。
    /// </summary>
    public int SalesQuantity { get; set; }

    /// <summary>
    /// 营收金额。
    /// </summary>
    public decimal RevenueAmount { get; set; }

    /// <summary>
    /// 营收占比（%）。
    /// </summary>
    public decimal Percentage { get; set; }
}

/// <summary>
/// TOP 商品区块 DTO。
/// </summary>
public sealed class FinanceOverviewTopProductDto
{
    /// <summary>
    /// 统计周期（天）。
    /// </summary>
    public int PeriodDays { get; set; } = 30;

    /// <summary>
    /// 排行数据。
    /// </summary>
    public List<FinanceOverviewTopProductItemDto> Items { get; set; } = [];
}

/// <summary>
/// 财务概览页面 DTO。
/// </summary>
public sealed class FinanceOverviewDashboardDto
{
    /// <summary>
    /// 维度编码（tenant/store）。
    /// </summary>
    public string Dimension { get; set; } = "tenant";

    /// <summary>
    /// 门店标识（门店维度时有值）。
    /// </summary>
    public string? StoreId { get; set; }

    /// <summary>
    /// 今日营业额卡片。
    /// </summary>
    public FinanceOverviewKpiCardDto TodayRevenue { get; set; } = new();

    /// <summary>
    /// 实收卡片。
    /// </summary>
    public FinanceOverviewKpiCardDto ActualReceived { get; set; } = new();

    /// <summary>
    /// 退款卡片。
    /// </summary>
    public FinanceOverviewKpiCardDto RefundAmount { get; set; } = new();

    /// <summary>
    /// 净收入卡片。
    /// </summary>
    public FinanceOverviewKpiCardDto NetIncome { get; set; } = new();

    /// <summary>
    /// 可提现余额卡片。
    /// </summary>
    public FinanceOverviewKpiCardDto WithdrawableBalance { get; set; } = new();

    /// <summary>
    /// 收入趋势。
    /// </summary>
    public FinanceOverviewIncomeTrendDto IncomeTrend { get; set; } = new();

    /// <summary>
    /// 利润趋势。
    /// </summary>
    public FinanceOverviewProfitTrendDto ProfitTrend { get; set; } = new();

    /// <summary>
    /// 收入构成。
    /// </summary>
    public FinanceOverviewIncomeCompositionDto IncomeComposition { get; set; } = new();

    /// <summary>
    /// 成本构成。
    /// </summary>
    public FinanceOverviewCostCompositionDto CostComposition { get; set; } = new();

    /// <summary>
    /// TOP 商品排行。
    /// </summary>
    public FinanceOverviewTopProductDto TopProducts { get; set; } = new();
}
