{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "format",
    "schemaVersion",
    "modelVersion",
    "metadata",
    "initialConditions",
    "forcing"
  ],
  "properties": {
    "format": {
      "const": "preylab.environment"
    },
    "schemaVersion": {
      "const": 1
    },
    "modelVersion": {
      "const": 4
    },
    "metadata": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "name",
        "notes"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 80
        },
        "notes": {
          "type": "string",
          "maxLength": 1000
        }
      }
    },
    "initialConditions": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "volume",
        "light",
        "temperature",
        "nutrientLevel",
        "nutrientSeed",
        "nutrientField"
      ],
      "properties": {
        "volume": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000
        },
        "light": {
          "type": "number",
          "minimum": 0,
          "maximum": 100
        },
        "temperature": {
          "type": "number",
          "minimum": 5,
          "maximum": 40
        },
        "nutrientLevel": {
          "type": "number",
          "minimum": 0,
          "maximum": 100
        },
        "nutrientSeed": {
          "type": "string",
          "maxLength": 80
        },
        "nutrientField": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "version",
            "volume",
            "seed",
            "nx",
            "ny",
            "nz",
            "initialLevel",
            "values",
            "patches"
          ],
          "properties": {
            "version": {
              "const": 1
            },
            "volume": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000
            },
            "seed": {
              "type": "string",
              "maxLength": 80
            },
            "nx": {
              "const": 8
            },
            "ny": {
              "const": 8
            },
            "nz": {
              "const": 3
            },
            "initialLevel": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            },
            "values": {
              "type": "array",
              "minItems": 192,
              "maxItems": 192,
              "items": {
                "type": "number",
                "minimum": 0,
                "maximum": 4
              }
            },
            "patches": {
              "type": "array",
              "maxItems": 256,
              "items": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "id",
                  "x",
                  "y",
                  "z",
                  "mass"
                ],
                "properties": {
                  "id": {
                    "type": "string",
                    "maxLength": 100
                  },
                  "x": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1
                  },
                  "y": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1
                  },
                  "z": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1
                  },
                  "mass": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 16
                  }
                }
              }
            }
          }
        }
      }
    },
    "forcing": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "drift",
        "automatic",
        "lamp",
        "cycle"
      ],
      "properties": {
        "drift": {
          "type": "number",
          "minimum": 0,
          "maximum": 100
        },
        "automatic": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "enabled",
            "current",
            "nutrient"
          ],
          "properties": {
            "enabled": {
              "type": "boolean"
            },
            "current": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "enabled",
                "intervalMs",
                "durationMs",
                "rampMs",
                "strength",
                "direction",
                "directionMode",
                "jitterMs"
              ],
              "properties": {
                "enabled": {
                  "type": "boolean"
                },
                "intervalMs": {
                  "type": "number",
                  "minimum": 10000,
                  "maximum": 3600000
                },
                "durationMs": {
                  "type": "number",
                  "minimum": 1000,
                  "maximum": 300000
                },
                "rampMs": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 150000
                },
                "strength": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 100
                },
                "direction": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 359
                },
                "directionMode": {
                  "enum": [
                    "fixed",
                    "random",
                    "wave"
                  ]
                },
                "jitterMs": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 300000
                }
              }
            },
            "nutrient": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "enabled",
                "regulated",
                "intervalMs",
                "amount",
                "jitterMs"
              ],
              "properties": {
                "enabled": {
                  "type": "boolean"
                },
                "regulated": {
                  "type": "boolean"
                },
                "intervalMs": {
                  "type": "number",
                  "minimum": 10000,
                  "maximum": 3600000
                },
                "amount": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 24
                },
                "jitterMs": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 300000
                }
              }
            }
          }
        },
        "lamp": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "pitch",
            "azimuth",
            "turbidity",
            "beamDiameter"
          ],
          "properties": {
            "pitch": {
              "type": "number",
              "minimum": 0,
              "maximum": 60
            },
            "azimuth": {
              "type": "number",
              "minimum": 0,
              "maximum": 360
            },
            "turbidity": {
              "type": "number",
              "minimum": 0,
              "maximum": 8
            },
            "beamDiameter": {
              "type": "number",
              "minimum": 10,
              "maximum": 100
            }
          }
        },
        "cycle": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "enabled",
            "periodMs",
            "duty",
            "transitionMs",
            "phaseMs",
            "anchorAt"
          ],
          "properties": {
            "enabled": {
              "type": "boolean"
            },
            "periodMs": {
              "type": "number",
              "minimum": 10000,
              "maximum": 3600000
            },
            "duty": {
              "type": "number",
              "minimum": 0,
              "maximum": 1
            },
            "transitionMs": {
              "type": "number",
              "minimum": 0,
              "maximum": 300000
            },
            "phaseMs": {
              "type": "number",
              "minimum": 0,
              "maximum": 3600000
            },
            "anchorAt": {
              "type": "number",
              "minimum": 0,
              "maximum": 1000000000000
            }
          }
        }
      }
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "PreyLab resolved environment preset v1"
}
