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

/// <summary>
/// 成本录入明细项 DTO。
/// </summary>
public sealed class FinanceCostEntryDetailDto
{
    /// <summary>
    /// 明细标识。
    /// </summary>
    public string? ItemId { get; set; }

    /// <summary>
    /// 明细名称。
    /// </summary>
    public string ItemName { get; set; } = string.Empty;

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

    /// <summary>
    /// 数量（人工类可用）。
    /// </summary>
    public decimal? Quantity { get; set; }

    /// <summary>
    /// 单价（人工类可用）。
    /// </summary>
    public decimal? UnitPrice { get; set; }

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

/// <summary>
/// 成本录入分类 DTO。
/// </summary>
public sealed class FinanceCostEntryCategoryDto
{
    /// <summary>
    /// 分类编码。
    /// </summary>
    public string Category { get; set; } = string.Empty;

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

    /// <summary>
    /// 分类总金额。
    /// </summary>
    public decimal TotalAmount { get; set; }

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

    /// <summary>
    /// 分类明细项。
    /// </summary>
    public List<FinanceCostEntryDetailDto> Items { get; set; } = [];
}

/// <summary>
/// 成本录入页 DTO。
/// </summary>
public sealed class FinanceCostEntryDto
{
    /// <summary>
    /// 维度编码。
    /// </summary>
    public string Dimension { get; set; } = "tenant";

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

    /// <summary>
    /// 月份（yyyy-MM）。
    /// </summary>
    public string Month { get; set; } = string.Empty;

    /// <summary>
    /// 本月营业额。
    /// </summary>
    public decimal MonthRevenue { get; set; }

    /// <summary>
    /// 本月总成本。
    /// </summary>
    public decimal TotalCost { get; set; }

    /// <summary>
    /// 本月成本率（%）。
    /// </summary>
    public decimal CostRate { get; set; }

    /// <summary>
    /// 分类集合。
    /// </summary>
    public List<FinanceCostEntryCategoryDto> Categories { get; set; } = [];
}

/// <summary>
/// 成本分析统计卡 DTO。
/// </summary>
public sealed class FinanceCostAnalysisStatsDto
{
    /// <summary>
    /// 本月总成本。
    /// </summary>
    public decimal TotalCost { get; set; }

    /// <summary>
    /// 食材成本率（%）。
    /// </summary>
    public decimal FoodCostRate { get; set; }

    /// <summary>
    /// 单均成本。
    /// </summary>
    public decimal AverageCostPerPaidOrder { get; set; }

    /// <summary>
    /// 环比变化（%）。
    /// </summary>
    public decimal MonthOnMonthChangeRate { get; set; }

    /// <summary>
    /// 本月营业额。
    /// </summary>
    public decimal Revenue { get; set; }

    /// <summary>
    /// 本月支付成功订单数。
    /// </summary>
    public int PaidOrderCount { get; set; }
}

/// <summary>
/// 成本趋势点 DTO。
/// </summary>
public sealed class FinanceCostTrendPointDto
{
    /// <summary>
    /// 月份（yyyy-MM）。
    /// </summary>
    public string Month { get; set; } = string.Empty;

    /// <summary>
    /// 月度总成本。
    /// </summary>
    public decimal TotalCost { get; set; }

    /// <summary>
    /// 月度营业额。
    /// </summary>
    public decimal Revenue { get; set; }

    /// <summary>
    /// 月度成本率（%）。
    /// </summary>
    public decimal CostRate { get; set; }
}

/// <summary>
/// 成本构成项 DTO。
/// </summary>
public sealed class FinanceCostCompositionItemDto
{
    /// <summary>
    /// 分类编码。
    /// </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 FinanceCostMonthlyDetailRowDto
{
    /// <summary>
    /// 月份（yyyy-MM）。
    /// </summary>
    public string Month { get; set; } = string.Empty;

    /// <summary>
    /// 食材成本。
    /// </summary>
    public decimal FoodAmount { get; set; }

    /// <summary>
    /// 人工成本。
    /// </summary>
    public decimal LaborAmount { get; set; }

    /// <summary>
    /// 固定费用。
    /// </summary>
    public decimal FixedAmount { get; set; }

    /// <summary>
    /// 包装耗材。
    /// </summary>
    public decimal PackagingAmount { get; set; }

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

    /// <summary>
    /// 成本率（%）。
    /// </summary>
    public decimal CostRate { get; set; }
}

/// <summary>
/// 成本分析页 DTO。
/// </summary>
public sealed class FinanceCostAnalysisDto
{
    /// <summary>
    /// 维度编码。
    /// </summary>
    public string Dimension { get; set; } = "tenant";

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

    /// <summary>
    /// 月份（yyyy-MM）。
    /// </summary>
    public string Month { get; set; } = string.Empty;

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

    /// <summary>
    /// 趋势数据。
    /// </summary>
    public List<FinanceCostTrendPointDto> Trend { get; set; } = [];

    /// <summary>
    /// 构成数据。
    /// </summary>
    public List<FinanceCostCompositionItemDto> Composition { get; set; } = [];

    /// <summary>
    /// 明细表数据。
    /// </summary>
    public List<FinanceCostMonthlyDetailRowDto> DetailRows { get; set; } = [];
}
