{
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "$id": "https://deck-twin-library.demoareeb.workers.dev/r/plant.schema.json",
 "title": "Deck Twin plant.json",
 "description": "A plant built from registry components. Take component names, props and port ids from the CLI, and run `deck-twin validate` on the result.",
 "type": "object",
 "required": [
  "name",
  "items"
 ],
 "additionalProperties": false,
 "properties": {
  "$schema": {
   "type": "string"
  },
  "name": {
   "type": "string",
   "minLength": 1
  },
  "description": {
   "type": "string"
  },
  "source": {
   "type": "string",
   "description": "Drawing numbers or documents this plant was taken from."
  },
  "items": {
   "type": "array",
   "items": {
    "$ref": "#/$defs/item"
   }
  },
  "lines": {
   "type": "array",
   "items": {
    "$ref": "#/$defs/line"
   }
  },
  "camera": {
   "type": "object",
   "required": [
    "target",
    "radius"
   ],
   "additionalProperties": false,
   "properties": {
    "target": {
     "type": "array",
     "items": {
      "type": "number"
     },
     "minItems": 3,
     "maxItems": 3
    },
    "radius": {
     "type": "number"
    },
    "direction": {
     "type": "array",
     "items": {
      "type": "number"
     },
     "minItems": 3,
     "maxItems": 3
    }
   }
  },
  "sea": {
   "type": "object",
   "required": [
    "level"
   ],
   "additionalProperties": false,
   "properties": {
    "level": {
     "type": "number",
     "description": "Mean sea level as plant y (-airGap for a jacket at y = 0)."
    },
    "depth": {
     "type": "number"
    },
    "waves": {
     "type": "number"
    }
   }
  }
 },
 "$defs": {
  "item": {
   "type": "object",
   "required": [
    "tag",
    "component"
   ],
   "additionalProperties": false,
   "properties": {
    "tag": {
     "type": "string",
     "minLength": 1
    },
    "component": {
     "enum": [
      "access-platform",
      "acoustic-gas-leak-detector",
      "air-cooled-exchanger",
      "air-receiver",
      "alarm-beacon",
      "analyser-shelter",
      "aspirating-smoke-detector",
      "ball-valve",
      "basket-strainer",
      "beam-smoke-detector",
      "between-bearings-pump",
      "blind-flange",
      "blowdown-valve",
      "bop-stack",
      "breathing-apparatus-cabinet",
      "bridge",
      "bullet-tank",
      "bund-wall",
      "busbar-gantry",
      "butterfly-valve",
      "cable-tray",
      "caisson",
      "cargo-basket",
      "cartridge-filter",
      "cctv-camera",
      "cement-unit",
      "centrifugal-compressor",
      "centrifugal-fan",
      "centrifugal-pump",
      "check-valve-piston",
      "chemical-injection-skid",
      "choke-manifold",
      "choke-valve",
      "christmas-tree",
      "coiled-tubing-unit",
      "column",
      "compact-prover",
      "control-console",
      "control-valve",
      "cooling-tower",
      "coriolis-flowmeter",
      "davit-crane",
      "deck-module",
      "deluge-nozzle",
      "deluge-valve-skid",
      "desander",
      "desk",
      "diesel-firewater-pump",
      "diesel-generator",
      "disconnector",
      "door",
      "dp-transmitter",
      "drain-hub",
      "drilling-derrick",
      "dual-plate-check-valve",
      "e-house",
      "elbow",
      "electric-heater",
      "electric-motor",
      "emergency-light",
      "emergency-telephone",
      "escape-sign",
      "esd-valve",
      "expansion-joint",
      "filter-separator",
      "fire-alarm-panel",
      "fire-blanket",
      "fire-extinguisher",
      "fire-hydrant",
      "fire-monitor",
      "fired-heater",
      "first-aid-station",
      "flame-detector",
      "flanged-joint",
      "flare-boom",
      "flare-stack",
      "flexible-hose",
      "gas-cylinder-quad",
      "gas-turbine-compressor",
      "gas-turbine-generator",
      "gasket",
      "gate-valve",
      "gatehouse",
      "globe-valve",
      "grating-panel",
      "guided-wave-radar",
      "hairpin-exchanger",
      "hammer-union",
      "handrail",
      "heat-detector",
      "helideck",
      "horizontal-separator",
      "hose-reel",
      "hv-circuit-breaker",
      "hydraulic-power-unit",
      "hydrocyclone-package",
      "hydrogen-detector",
      "hypochlorite-generator",
      "industrial-building",
      "instrument-air-package",
      "instrument-transformer",
      "insulating-joint",
      "jacket",
      "junction-box",
      "knife-gate-valve",
      "ladder",
      "lap-joint-flange",
      "level-switch",
      "life-ring",
      "lifeboat-davit",
      "lifejacket-box",
      "lighting-mast",
      "local-control-station",
      "magnetic-flowmeter",
      "magnetic-level-gauge",
      "manual-call-point",
      "marine-loading-arm",
      "metering-pump",
      "metering-skid",
      "module-frame",
      "monorail-hoist",
      "motor-operated-valve",
      "mud-pump",
      "mud-tank",
      "navigation-aid",
      "needle-valve",
      "neutral-earthing-resistor",
      "nitrogen-generator",
      "ocean",
      "oily-water-separator",
      "olet",
      "open-path-gas-detector",
      "operator-chair",
      "orifice-flowmeter",
      "pa-loudspeaker",
      "packaged-boiler",
      "pedestal-crane",
      "perimeter-fence",
      "pig-launcher",
      "pipe-clamp",
      "pipe-handling-catwalk",
      "pipe-rack",
      "pipe-spool",
      "pipe-support",
      "pipeline-valve-station",
      "plate-heat-exchanger",
      "plet",
      "plug-valve",
      "point-gas-detector",
      "pressure-gauge",
      "pressure-safety-valve",
      "pressure-switch",
      "pressure-transmitter",
      "printed-circuit-heat-exchanger",
      "production-manifold",
      "progressive-cavity-pump",
      "reciprocating-compressor",
      "reciprocating-pump",
      "reducer",
      "restriction-orifice",
      "riser",
      "room",
      "rupture-disc",
      "safety-shower",
      "screw-compressor",
      "shale-shaker",
      "shell-and-tube-exchanger",
      "shipping-container",
      "sight-glass",
      "sky",
      "slip-on-flange",
      "slug-catcher",
      "small-bore-fitting",
      "smoke-detector",
      "socket-weld-flange",
      "spectacle-blind",
      "spherical-tank",
      "stair",
      "steam-trap",
      "steel-beam",
      "steel-column",
      "storage-tank",
      "stud-bolt-set",
      "submersible-pump",
      "subsea-manifold",
      "subsea-tree",
      "surge-arrester",
      "swing-check-valve",
      "switchgear",
      "swivel-ring-flange",
      "system-cabinet",
      "tee",
      "teg-regeneration",
      "temperature-gauge",
      "temperature-transmitter",
      "threaded-flange",
      "tote-tank",
      "toxic-gas-detector",
      "transformer",
      "truck-loading-bay",
      "ultrasonic-flowmeter",
      "umbilical-termination-assembly",
      "ups-battery-cabinet",
      "utility-station",
      "vent-stack",
      "vertical-inline-pump",
      "vertical-separator",
      "vertical-turbine-pump",
      "vfd-cabinet",
      "vibration-probe",
      "video-wall",
      "vortex-flowmeter",
      "wall-display",
      "water-filter-package",
      "weld-neck-flange",
      "wellhead-control-panel",
      "wellhead-housing",
      "window",
      "windsock",
      "y-strainer"
     ]
    },
    "props": {
     "type": "object",
     "description": "From `deck-twin info <name>`."
    },
    "position": {
     "type": "array",
     "items": {
      "type": "number"
     },
     "minItems": 3,
     "maxItems": 3,
     "description": "[x, y, z] metres: x east, y up, z south. y is the level the item stands on."
    },
    "rotation": {
     "type": "number",
     "description": "Degrees about +Y."
    }
   }
  },
  "line": {
   "type": "object",
   "required": [
    "tag",
    "from",
    "to"
   ],
   "additionalProperties": false,
   "properties": {
    "tag": {
     "type": "string",
     "description": "Line number: SIZE\"-SERVICE-SEQ-CLASS-INSULATION, e.g. 8\"-PG-2101-D6A-N."
    },
    "from": {
     "$ref": "#/$defs/end"
    },
    "to": {
     "$ref": "#/$defs/end"
    },
    "service": {
     "enum": [
      "oil",
      "gas",
      "multiphase",
      "water",
      "seawater",
      "firewater",
      "steam",
      "air",
      "nitrogen",
      "chemical",
      "flare",
      "drain",
      "fuel-gas",
      "diesel",
      "potable",
      "cooling"
     ]
    },
    "nps": {
     "type": "number"
    },
    "schedule": {
     "type": "string"
    },
    "insulated": {
     "type": "boolean"
    },
    "elevation": {
     "type": "number"
    },
    "order": {
     "enum": [
      "xz",
      "zx"
     ]
    },
    "via": {
     "type": "array",
     "items": {
      "type": "array",
      "items": {
       "type": "number"
      },
      "minItems": 3,
      "maxItems": 3
     }
    },
    "supports": {
     "type": "boolean"
    },
    "inline": {
     "type": "array",
     "items": {
      "type": "object",
      "required": [
       "component"
      ],
      "additionalProperties": false,
      "properties": {
       "component": {
        "enum": [
         "ball-valve",
         "basket-strainer",
         "blowdown-valve",
         "butterfly-valve",
         "check-valve-piston",
         "control-valve",
         "coriolis-flowmeter",
         "dual-plate-check-valve",
         "esd-valve",
         "expansion-joint",
         "flanged-joint",
         "flexible-hose",
         "gate-valve",
         "globe-valve",
         "hammer-union",
         "insulating-joint",
         "knife-gate-valve",
         "magnetic-flowmeter",
         "motor-operated-valve",
         "needle-valve",
         "orifice-flowmeter",
         "pipe-spool",
         "plug-valve",
         "reducer",
         "restriction-orifice",
         "rupture-disc",
         "sight-glass",
         "spectacle-blind",
         "steam-trap",
         "swing-check-valve",
         "ultrasonic-flowmeter",
         "vortex-flowmeter",
         "y-strainer"
        ]
       },
       "at": {
        "type": "number",
        "minimum": 0,
        "maximum": 1
       },
       "tag": {
        "type": "string"
       },
       "props": {
        "type": "object"
       }
      }
     }
    }
   }
  },
  "end": {
   "oneOf": [
    {
     "type": "string",
     "pattern": "^.+\\..+$",
     "description": "\"TAG.port\", with the port id from `deck-twin info <name>`."
    },
    {
     "type": "object",
     "required": [
      "at"
     ],
     "additionalProperties": false,
     "description": "Battery limit: where the line leaves the plot.",
     "properties": {
      "at": {
       "type": "array",
       "items": {
        "type": "number"
       },
       "minItems": 3,
       "maxItems": 3
      },
      "direction": {
       "type": "array",
       "items": {
        "type": "number"
       },
       "minItems": 3,
       "maxItems": 3
      },
      "label": {
       "type": "string"
      }
     }
    }
   ]
  }
 }
}