namespace PowderCoating.Application.DTOs.AI; // ── Input ───────────────────────────────────────────────────────────────────── /// Lightweight representation of a catalog item sent to Claude for analysis. public class CatalogItemForPriceCheck { public int Id { get; set; } public string Name { get; set; } = string.Empty; public string? Description { get; set; } public string CategoryName { get; set; } = string.Empty; public decimal CurrentPrice { get; set; } public decimal? ApproximateAreaSqFt { get; set; } public int? EstimatedMinutes { get; set; } public bool RequiresSandblasting { get; set; } public bool RequiresMasking { get; set; } } /// Operating cost summary injected into the Claude system prompt. public class ShopOperatingCostSummary { public decimal LaborRatePerHour { get; set; } public decimal OvenCostPerHour { get; set; } public decimal SandblasterCostPerHour { get; set; } public decimal CoatingBoothCostPerHour { get; set; } public decimal PowderCostPerSqFt { get; set; } public decimal ShopSuppliesRatePercent { get; set; } public decimal MarkupOrMarginPercent { get; set; } public string PricingMode { get; set; } = "markup"; // "markup" or "margin" public decimal ShopMinimumCharge { get; set; } public string? AiContextProfile { get; set; } } // ── Per-Item Result ─────────────────────────────────────────────────────────── /// Verdict on a single catalog item's price health. public class CatalogItemPriceVerdict { public int CatalogItemId { get; set; } public string Name { get; set; } = string.Empty; public decimal CurrentPrice { get; set; } /// Assumptions Claude made about size/complexity to estimate costs. public string Assumptions { get; set; } = string.Empty; public decimal EstimatedSqFtMin { get; set; } public decimal EstimatedSqFtMax { get; set; } public int EstimatedMinutesMin { get; set; } public int EstimatedMinutesMax { get; set; } /// Calculated cost floor using the shop's own rates. public decimal CostFloor { get; set; } /// ok | low | high | below-cost public string Verdict { get; set; } = "ok"; public decimal SuggestedPriceMin { get; set; } public decimal SuggestedPriceMax { get; set; } /// high | medium | low public string Confidence { get; set; } = "medium"; public string Reasoning { get; set; } = string.Empty; } // ── Report ──────────────────────────────────────────────────────────────────── public class CatalogPriceCheckReportDto { public int Id { get; set; } public DateTime RunAt { get; set; } public int ItemsChecked { get; set; } public int BelowCostCount { get; set; } public int LowMarginCount { get; set; } public int HighPriceCount { get; set; } public int OkCount { get; set; } public List Results { get; set; } = new(); public string OperatingCostsSummary { get; set; } = string.Empty; }