namespace Extrudex.API.DTOs.PrintJobs;

/// <summary>
/// Response DTO for the cost summary of a print job.
/// Provides a breakdown of material cost based on filament usage
/// and spool pricing data. If cost data is incomplete, warnings
/// are returned instead of throwing an error.
/// </summary>
public class CostSummaryResponse
{
    /// <summary>Unique identifier of the print job.</summary>
    public Guid PrintJobId { get; set; }

    /// <summary>Human-readable name of the print job.</summary>
    public string PrintName { get; set; } = string.Empty;

    /// <summary>Foreign key to the spool used for this print job.</summary>
    public Guid SpoolId { get; set; }

    /// <summary>Serial number of the spool.</summary>
    public string SpoolSerial { get; set; } = string.Empty;

    /// <summary>Brand of the spool.</summary>
    public string SpoolBrand { get; set; } = string.Empty;

    /// <summary>Color name of the spool.</summary>
    public string SpoolColorName { get; set; } = string.Empty;

    /// <summary>Total millimeters of filament extruded during this print.</summary>
    public decimal MmExtruded { get; set; }

    /// <summary>Derived grams consumed for this print job.</summary>
    public decimal GramsDerived { get; set; }

    /// <summary>Purchase price of the full spool, if available.</summary>
    public decimal? SpoolPurchasePrice { get; set; }

    /// <summary>Total weight of the spool in grams when full.</summary>
    public decimal? SpoolWeightTotalGrams { get; set; }

    /// <summary>Calculated price per gram (purchase price / total weight), if available.</summary>
    public decimal? PricePerGram { get; set; }

    /// <summary>Calculated total material cost for this print job, if available.</summary>
    public decimal? TotalMaterialCost { get; set; }

    /// <summary>The CostPerPrint stored on the print job entity, if set.</summary>
    public decimal? StoredCostPerPrint { get; set; }

    /// <summary>
    /// Warnings about missing data that prevent cost calculation.
    /// Empty if all data is available and cost was calculated successfully.
    /// </summary>
    public List<string> Warnings { get; set; } = new();
}