{
  "title": "Vehicle wrap quote calculator field specification",
  "version": "1.0",
  "currency_representation": "Three-letter label; no conversion",
  "fields": [
    {
      "name": "length_unit",
      "type": "enum",
      "allowed": [
        "ft",
        "m"
      ],
      "required": true,
      "purpose": "Area unit follows selected length unit."
    },
    {
      "name": "coverage_mode",
      "type": "enum",
      "allowed": [
        "panels",
        "measured_area"
      ],
      "required": true,
      "exclusive": true
    },
    {
      "name": "panels",
      "type": "array<object>",
      "required_if": "coverage_mode=panels",
      "minimum_items": 1,
      "fields": [
        {
          "name": "panel_id",
          "type": "stable string",
          "required": true
        },
        {
          "name": "name",
          "type": "string",
          "required": true
        },
        {
          "name": "length",
          "type": "finite number",
          "required": true,
          "exclusive_minimum": 0
        },
        {
          "name": "width",
          "type": "finite number",
          "required": true,
          "exclusive_minimum": 0
        }
      ]
    },
    {
      "name": "measured_area",
      "type": "finite number",
      "required_if": "coverage_mode=measured_area",
      "exclusive_minimum": 0
    },
    {
      "name": "waste_percent",
      "type": "finite number",
      "required": true,
      "minimum": 0,
      "maximum": 100
    },
    {
      "name": "material_rate_per_area_unit",
      "type": "finite number",
      "required": true,
      "minimum": 0
    },
    {
      "name": "labor_hours",
      "type": "finite number",
      "required": true,
      "minimum": 0
    },
    {
      "name": "labor_rate_per_hour",
      "type": "finite number",
      "required": true,
      "minimum": 0
    },
    {
      "name": "fixed_costs",
      "type": "array<object>",
      "required": false,
      "fields": [
        {
          "name": "cost_id",
          "type": "stable string",
          "required": true
        },
        {
          "name": "name",
          "type": "string",
          "required": true
        },
        {
          "name": "amount",
          "type": "finite number",
          "required": true,
          "minimum": 0
        }
      ]
    },
    {
      "name": "currency",
      "type": "string",
      "required": true,
      "pattern": "^[A-Z]{3}$"
    }
  ],
  "formula": {
    "coverage": "sum(panel length * panel width) or supplied measured area",
    "material_area": "coverage * (1 + waste_percent/100)",
    "material_cost": "material_area * own material rate",
    "labor": "own hours * own hourly rate",
    "total": "material cost + labor + fixed charges"
  },
  "validation": [
    "Select panels or measured total area, not both.",
    "Do not infer area from vehicle make/model/year.",
    "Apply waste only to material area.",
    "Exports are itemized CSV and quote PDF."
  ]
}
