using MediatR;
using TakeoutSaaS.Application.App.Finance.Cost.Dto;
using TakeoutSaaS.Domain.Finance.Enums;

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

/// <summary>
/// 保存成本录入数据。
/// </summary>
public sealed class SaveFinanceCostEntryCommand : IRequest<FinanceCostEntryDto>
{
    /// <summary>
    /// 统计维度。
    /// </summary>
    public FinanceCostDimension Dimension { get; init; } = FinanceCostDimension.Tenant;

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

    /// <summary>
    /// 目标月份（UTC 每月第一天）。
    /// </summary>
    public DateTime CostMonth { get; init; } = DateTime.UtcNow;

    /// <summary>
    /// 成本分类列表。
    /// </summary>
    public IReadOnlyList<SaveFinanceCostCategoryCommandItem> Categories { get; init; } = [];
}

/// <summary>
/// 成本分类保存项。
/// </summary>
public sealed class SaveFinanceCostCategoryCommandItem
{
    /// <summary>
    /// 成本分类。
    /// </summary>
    public FinanceCostCategory Category { get; init; }

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

    /// <summary>
    /// 分类明细项。
    /// </summary>
    public IReadOnlyList<SaveFinanceCostDetailCommandItem> Items { get; init; } = [];
}

/// <summary>
/// 成本明细保存项。
/// </summary>
public sealed class SaveFinanceCostDetailCommandItem
{
    /// <summary>
    /// 明细标识（编辑时透传，可为空）。
    /// </summary>
    public long? ItemId { get; init; }

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

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

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

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

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