using Extrudex.Domain.Base;

namespace Extrudex.Domain.Entities;

/// <summary>
/// Tracks filament consumption for a specific print job on a specific spool.
/// Each record captures the grams used, which printer consumed it, and when the
/// usage was recorded. This enables granular per-job usage analytics, COGS
/// reconciliation, and spool weight depletion tracking.
///
/// A single PrintJob may have multiple FilamentUsage records if multiple spools
/// were consumed (e.g., multi-material prints via AMS).
/// </summary>
public class FilamentUsage : AuditableEntity
{
    /// <summary>
    /// Foreign key to the print job that consumed this filament.
    /// A usage record is always tied to a print job.
    /// </summary>
    public Guid PrintJobId { get; set; }

    /// <summary>
    /// Navigation to the print job that consumed this filament.
    /// </summary>
    public PrintJob PrintJob { get; set; } = null!;

    /// <summary>
    /// Foreign key to the spool (filament) that provided the material.
    /// Links usage back to the specific physical spool for inventory tracking.
    /// </summary>
    public Guid SpoolId { get; set; }

    /// <summary>
    /// Navigation to the spool that provided the material.
    /// </summary>
    public Spool Spool { get; set; } = null!;

    /// <summary>
    /// Foreign key to the printer that executed the print job.
    /// Denormalized from PrintJob for direct querying of per-printer usage.
    /// </summary>
    public Guid PrinterId { get; set; }

    /// <summary>
    /// Navigation to the printer that executed the print job.
    /// </summary>
    public Printer Printer { get; set; } = null!;

    /// <summary>
    /// Grams of filament consumed during this print job.
    /// Derived from mm_extruded × cross_section_area × material_density,
    /// or measured directly from AMS weight delta.
    /// </summary>
    public decimal GramsUsed { get; set; }

    /// <summary>
    /// Millimeters of filament extruded for this usage record.
    /// The primary physical measurement; grams_used is derived from this.
    /// </summary>
    public decimal MmExtruded { get; set; }

    /// <summary>
    /// Timestamp when this usage record was created (UTC).
    /// Represents when the usage was first logged, which may differ from
    /// the print job's started_at or completed_at timestamps.
    /// </summary>
    public DateTime RecordedAt { get; set; } = DateTime.UtcNow;

    /// <summary>
    /// Optional notes about this usage record (e.g., "AMS tray 3", "manual weight check").
    /// </summary>
    public string? Notes { get; set; }
}