namespace TakeoutSaaS.TenantApi.Contracts.Finance;

/// <summary>
/// 成本模块通用作用域请求。
/// </summary>
public class FinanceCostScopeRequest
{
    /// <summary>
    /// 维度（tenant/store）。
    /// </summary>
    public string? Dimension { get; set; }

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

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

/// <summary>
/// 成本录入查询请求。
/// </summary>
public sealed class FinanceCostEntryRequest : FinanceCostScopeRequest;

/// <summary>
/// 成本分析查询请求。
/// </summary>
public sealed class FinanceCostAnalysisRequest : FinanceCostScopeRequest
{
    /// <summary>
    /// 趋势月份数量。
    /// </summary>
    public int TrendMonthCount { get; set; } = 6;
}

/// <summary>
/// 成本录入保存请求。
/// </summary>
public sealed class SaveFinanceCostEntryRequest : FinanceCostScopeRequest
{
    /// <summary>
    /// 分类列表。
    /// </summary>
    public List<SaveFinanceCostCategoryRequest> Categories { get; set; } = [];
}

/// <summary>
/// 成本分类保存项请求。
/// </summary>
public sealed class SaveFinanceCostCategoryRequest
{
    /// <summary>
    /// 分类编码（food/labor/fixed/packaging）。
    /// </summary>
    public string Category { get; set; } = string.Empty;

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

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

/// <summary>
/// 成本明细保存项请求。
/// </summary>
public sealed class SaveFinanceCostDetailRequest
{
    /// <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>
/// 成本录入响应。
/// </summary>
public sealed class FinanceCostEntryResponse
{
    /// <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<FinanceCostEntryCategoryResponse> Categories { get; set; } = [];
}

/// <summary>
/// 成本分类响应。
/// </summary>
public sealed class FinanceCostEntryCategoryResponse
{
    /// <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<FinanceCostEntryDetailResponse> Items { get; set; } = [];
}

/// <summary>
/// 成本明细响应。
/// </summary>
public sealed class FinanceCostEntryDetailResponse
{
    /// <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>
/// 成本分析响应。
/// </summary>
public sealed class FinanceCostAnalysisResponse
{
    /// <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 FinanceCostAnalysisStatsResponse Stats { get; set; } = new();

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

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

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

/// <summary>
/// 成本分析统计卡响应。
/// </summary>
public sealed class FinanceCostAnalysisStatsResponse
{
    /// <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>
/// 成本趋势点响应。
/// </summary>
public sealed class FinanceCostTrendPointResponse
{
    /// <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>
/// 成本构成响应。
/// </summary>
public sealed class FinanceCostCompositionResponse
{
    /// <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>
/// 成本分析明细表行响应。
/// </summary>
public sealed class FinanceCostMonthlyDetailResponse
{
    /// <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; }
}
