namespace PowderCoating.Core.Entities;

public class JobItem : BaseEntity
{
    public int JobId { get; set; }
    public string Description { get; set; } = string.Empty;
    public decimal Quantity { get; set; }
    
    // Powder/Material Information
    public string? ColorName { get; set; }
    public string? ColorCode { get; set; }
    public string? Finish { get; set; } // Gloss, Matte, Satin, etc.

    // Measurements
    public decimal? SurfaceArea { get; set; }
    public decimal SurfaceAreaSqFt { get; set; }

    // Catalog item reference (optional — null for generic/labor items)
    public int? CatalogItemId { get; set; }

    // Pricing
    public decimal UnitPrice { get; set; }
    public decimal TotalPrice { get; set; }
    public decimal LaborCost { get; set; }
    public bool IsGenericItem { get; set; }
    public decimal? ManualUnitPrice { get; set; }
    public decimal? PowderCostOverride { get; set; }  // Optional unit price override for catalog items
    public bool IsLaborItem { get; set; }
    public bool IsSalesItem { get; set; }
    public string? Sku { get; set; }
    public bool IncludePrepCost { get; set; } = true;

    // Processing Details
    public bool RequiresSandblasting { get; set; }
    public bool RequiresMasking { get; set; }
    public int EstimatedMinutes { get; set; }

    public string? Notes { get; set; }

    // Part complexity level — applies a price multiplier for calculated items
    // Values: "Simple" | "Moderate" | "Complex" | "Extreme"
    public string? Complexity { get; set; }

    // True when this item originated from an AI Photo Quote — ManualUnitPrice is used as-is
    // and oven cost is not double-charged (it was excluded from the AI estimate at quote level).
    public bool IsAiItem { get; set; }

    // AI-generated standardized tags (comma-separated, e.g. "automotive,tubular")
    public string? AiTags { get; set; }

    // Link to shared AI prediction record (null for non-AI items; shared with QuoteItem when converted)
    public int? AiPredictionId { get; set; }
    public virtual AiItemPrediction? AiPrediction { get; set; }

    // Custom formula item — see IsCustomFormulaItem routing in PricingCalculationService
    public bool IsCustomFormulaItem { get; set; }
    public int? CustomItemTemplateId { get; set; }
    public virtual CustomItemTemplate? CustomItemTemplate { get; set; }

    /// <summary>Snapshot of field name/value pairs used in the formula, stored as JSON for display on details views.</summary>
    public string? FormulaFieldValuesJson { get; set; }

    // Relationships
    public virtual Job Job { get; set; } = null!;
    public virtual CatalogItem? CatalogItem { get; set; }
    public virtual ICollection<JobItemCoat> Coats { get; set; } = new List<JobItemCoat>();
    public virtual ICollection<JobItemPrepService> PrepServices { get; set; } = new List<JobItemPrepService>();
}
