namespace TakeoutSaaS.Domain.Tenants.Entities;

/// <summary>
/// 账单明细项（值对象）。
/// 用于记录账单中的单项费用明细，如套餐费用、配额包费用等。
/// </summary>
public sealed class BillingLineItem
{
    /// <summary>
    /// 明细项类型（如：套餐费、配额包、其他费用）。
    /// </summary>
    public string ItemType { get; set; } = string.Empty;

    /// <summary>
    /// 明细项描述。
    /// </summary>
    public string Description { get; set; } = string.Empty;

    /// <summary>
    /// 数量。
    /// </summary>
    public decimal Quantity { get; set; }

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

    /// <summary>
    /// 金额（数量 × 单价）。
    /// </summary>
    public decimal Amount { get; set; }

    /// <summary>
    /// 折扣率（0-1 之间，如 0.1 表示 10% 折扣）。
    /// </summary>
    public decimal DiscountRate { get; set; }

    /// <summary>
    /// 创建账单明细项。
    /// </summary>
    /// <param name="itemType">明细项类型。</param>
    /// <param name="description">描述。</param>
    /// <param name="quantity">数量。</param>
    /// <param name="unitPrice">单价。</param>
    /// <param name="discountRate">折扣率。</param>
    /// <returns>账单明细项实例。</returns>
    public static BillingLineItem Create(
        string itemType,
        string description,
        decimal quantity,
        decimal unitPrice,
        decimal discountRate = 0)
    {
        var amount = quantity * unitPrice * (1 - discountRate);
        return new BillingLineItem
        {
            ItemType = itemType,
            Description = description,
            Quantity = quantity,
            UnitPrice = unitPrice,
            Amount = amount,
            DiscountRate = discountRate
        };
    }

    /// <summary>
    /// 计算折扣后的金额。
    /// </summary>
    /// <returns>折扣后金额。</returns>
    public decimal CalculateDiscountedAmount()
    {
        return Quantity * UnitPrice * (1 - DiscountRate);
    }

    /// <summary>
    /// 获取折扣金额。
    /// </summary>
    /// <returns>折扣金额。</returns>
    public decimal GetDiscountAmount()
    {
        return Quantity * UnitPrice * DiscountRate;
    }
}
