{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://vho.bio/schema/record/v1",
  "title": "VHO effective record",
  "type": "object",
  "required": [
    "@context",
    "@id",
    "kind",
    "subject",
    "altLabels",
    "taxonomyChain",
    "morphs",
    "traits",
    "qualities",
    "capacities",
    "requiredRoles",
    "retractions",
    "regimes",
    "diet",
    "sizingConstraints",
    "measurements",
    "substrate",
    "careGuide",
    "coverage",
    "endorsements",
    "meta"
  ],
  "additionalProperties": false,
  "properties": {
    "@context": { "const": "https://vho.bio/context/record/v1" },
    "@id": { "type": "string", "format": "uri" },
    "kind": { "enum": ["species", "morph"] },
    "subject": { "$ref": "#/$defs/iri" },
    "label": { "type": "string" },
    "altLabels": { "type": "array", "items": { "type": "string" } },
    "definition": { "type": "string" },
    "taxonomyChain": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": ["iri"],
        "additionalProperties": false,
        "properties": {
          "iri": { "$ref": "#/$defs/iri" },
          "label": { "type": "string" },
          "ncbiTaxon": { "$ref": "#/$defs/iri" }
        }
      }
    },
    "morphs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["iri", "record"],
        "additionalProperties": false,
        "properties": {
          "iri": { "$ref": "#/$defs/iri" },
          "record": { "type": "string", "format": "uri" }
        }
      }
    },
    "traits": { "type": "array", "items": { "$ref": "#/$defs/member" } },
    "qualities": { "type": "array", "items": { "$ref": "#/$defs/member" } },
    "capacities": { "type": "array", "items": { "$ref": "#/$defs/member" } },
    "requiredRoles": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["iri", "provenance"],
        "additionalProperties": false,
        "properties": {
          "iri": { "$ref": "#/$defs/iri" },
          "label": { "type": "string" },
          "minCount": { "type": "integer", "minimum": 1 },
          "basis": { "$ref": "#/$defs/iri" },
          "appliesWhen": { "type": "array", "items": { "$ref": "#/$defs/iri" } },
          "provenance": { "$ref": "#/$defs/provenance" }
        }
      }
    },
    "retractions": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["predicate", "member", "provenance"],
        "additionalProperties": false,
        "properties": {
          "predicate": { "$ref": "#/$defs/iri" },
          "member": { "$ref": "#/$defs/iri" },
          "provenance": { "$ref": "#/$defs/provenance" }
        }
      }
    },
    "regimes": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["axis", "period", "bands"],
        "additionalProperties": false,
        "properties": {
          "axis": { "$ref": "#/$defs/iri" },
          "period": { "$ref": "#/$defs/iri" },
          "zone": { "$ref": "#/$defs/iri" },
          "bands": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/band" } }
        }
      }
    },
    "diet": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["period", "foodstuff", "provenance"],
        "additionalProperties": false,
        "properties": {
          "period": { "$ref": "#/$defs/iri" },
          "foodstuff": { "type": "array", "items": { "$ref": "#/$defs/iri" } },
          "frequency": { "$ref": "#/$defs/band" },
          "supplementaryFoodstuff": { "type": "array", "items": { "$ref": "#/$defs/iri" } },
          "supplementaryFrequency": { "$ref": "#/$defs/band" },
          "provenance": { "$ref": "#/$defs/provenance" }
        }
      }
    },
    "sizingConstraints": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["constrains", "provenance"],
        "additionalProperties": false,
        "properties": {
          "constrains": { "$ref": "#/$defs/iri" },
          "comparator": { "$ref": "#/$defs/iri" },
          "basis": { "$ref": "#/$defs/iri" },
          "relativeTo": { "$ref": "#/$defs/iri" },
          "multiple": { "type": "number" },
          "absoluteFloor": { "type": "number" },
          "appliesWhen": { "type": "array", "items": { "$ref": "#/$defs/iri" } },
          "comment": { "type": "string" },
          "provenance": { "$ref": "#/$defs/provenance" }
        }
      }
    },
    "measurements": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["property", "bands"],
        "additionalProperties": false,
        "properties": {
          "property": { "$ref": "#/$defs/iri" },
          "measuredAs": { "$ref": "#/$defs/iri" },
          "bands": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/band" } }
        }
      }
    },
    "substrate": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "minDerivedWaterRetention": { "$ref": "#/$defs/band" }
      }
    },
    "enclosureClass": { "$ref": "#/$defs/member" },
    "ventilation": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "airExchangeLevel": { "$ref": "#/$defs/member" },
        "airflowPatterns": { "type": "array", "items": { "$ref": "#/$defs/member" } }
      }
    },
    "careGuide": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["describes", "provenance"],
        "additionalProperties": false,
        "properties": {
          "label": { "type": "string" },
          "order": { "type": "number" },
          "describes": { "type": "array", "items": { "$ref": "#/$defs/iri" } },
          "text": { "type": "string" },
          "provenance": { "$ref": "#/$defs/provenance" }
        }
      }
    },
    "coverage": {
      "type": "object",
      "additionalProperties": { "enum": ["present", "sourced-none", "uncurated"] }
    },
    "endorsements": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["iri", "agents"],
        "additionalProperties": false,
        "properties": {
          "iri": { "$ref": "#/$defs/iri" },
          "agents": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/iri" } },
          "record": { "type": "string", "format": "uri" },
          "date": { "type": "string" },
          "axes": { "type": "array", "items": { "$ref": "#/$defs/iri" } },
          "note": { "type": "string" },
          "sources": { "type": "array", "items": { "type": "string" } }
        }
      }
    },
    "meta": {
      "type": "object",
      "required": ["ontologyVersion", "releaseDate", "compilerVersion", "contextVersion"],
      "additionalProperties": false,
      "properties": {
        "ontologyVersion": { "type": "string" },
        "releaseDate": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" },
        "compilerVersion": { "type": "string" },
        "contextVersion": { "const": "v1" }
      }
    }
  },
  "$defs": {
    "iri": { "type": "string", "format": "uri" },
    "provenance": {
      "type": "object",
      "required": ["assertedOn"],
      "additionalProperties": false,
      "properties": {
        "assertedOn": {
          "oneOf": [{ "$ref": "#/$defs/iri" }, { "const": "individual" }]
        },
        "sources": { "type": "array", "items": { "type": "string" } },
        "contributors": { "type": "array", "items": { "$ref": "#/$defs/iri" } },
        "basis": { "$ref": "#/$defs/iri" }
      }
    },
    "band": {
      "type": "object",
      "required": ["provenance"],
      "additionalProperties": false,
      "properties": {
        "min": { "type": "number" },
        "max": { "type": "number" },
        "value": { "oneOf": [{ "type": "number" }, { "type": "string" }] },
        "unit": { "$ref": "#/$defs/iri" },
        "bandRole": { "$ref": "#/$defs/iri" },
        "comment": { "type": "string" },
        "provenance": { "$ref": "#/$defs/provenance" }
      }
    },
    "member": {
      "type": "object",
      "required": ["iri", "provenance"],
      "additionalProperties": false,
      "properties": {
        "iri": { "$ref": "#/$defs/iri" },
        "label": { "type": "string" },
        "provenance": { "$ref": "#/$defs/provenance" }
      }
    }
  }
}
