{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://www.michaeldariuseastwood.com/schemas/page-contract-policy.schema.json",
  "title": "Universal page contract policy",
  "type": "object",
  "additionalProperties": false,
  "required": ["schemaVersion", "policyId", "dateModified", "description", "identity", "classContracts", "routeOverrides", "machineLandingRules"],
  "properties": {
    "schemaVersion": {"const": 1},
    "policyId": {"type": "string", "minLength": 1},
    "dateModified": {"type": "string", "format": "date"},
    "description": {"type": "string", "minLength": 1},
    "identity": {
      "type": "object",
      "additionalProperties": false,
      "required": ["personId", "websiteId", "programmeId"],
      "properties": {
        "personId": {"type": "string", "format": "uri"},
        "websiteId": {"type": "string", "format": "uri"},
        "programmeId": {"type": "string", "format": "uri"}
      }
    },
    "classContracts": {
      "type": "object",
      "minProperties": 1,
      "additionalProperties": {"$ref": "#/$defs/contract"}
    },
    "routeOverrides": {
      "type": "object",
      "additionalProperties": {"$ref": "#/$defs/override"}
    },
    "machineLandingRules": {
      "type": "array",
      "items": {"$ref": "#/$defs/landingRule"}
    }
  },
  "$defs": {
    "stringArray": {"type": "array", "uniqueItems": true, "items": {"type": "string", "minLength": 1}},
    "evidenceDensity": {
      "type": "object",
      "additionalProperties": false,
      "required": ["requiredNamedQuotations", "requiredDatedStatistics", "requiredInlineCitations"],
      "properties": {
        "requiredNamedQuotations": {"type": "integer", "minimum": 0},
        "requiredDatedStatistics": {"type": "integer", "minimum": 0},
        "requiredInlineCitations": {"type": "integer", "minimum": 0}
      }
    },
    "contract": {
      "type": "object",
      "additionalProperties": false,
      "required": ["renderMode", "primarySchemaType", "mainEntityType", "humanRequirements", "machineRequirements", "evidenceDensity"],
      "properties": {
        "renderMode": {"enum": ["full", "metadata", "asset", "excluded"]},
        "primarySchemaType": {"type": ["string", "null"]},
        "mainEntityType": {"type": ["string", "null"]},
        "humanRequirements": {"$ref": "#/$defs/stringArray"},
        "machineRequirements": {"$ref": "#/$defs/stringArray"},
        "evidenceDensity": {"$ref": "#/$defs/evidenceDensity"}
      }
    },
    "override": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "primarySchemaType": {"type": ["string", "null"]},
        "mainEntityType": {"type": ["string", "null"]},
        "humanRequirements": {"$ref": "#/$defs/stringArray"},
        "machineRequirements": {"$ref": "#/$defs/stringArray"},
        "evidenceDensity": {"$ref": "#/$defs/evidenceDensity"}
      }
    },
    "landingRule": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id"],
      "properties": {
        "id": {"type": "string", "minLength": 1},
        "exact": {"$ref": "#/$defs/stringArray"},
        "prefix": {"type": "string"},
        "suffix": {"type": "string"},
        "landing": {"type": "string"},
        "replaceSuffixWith": {"type": "string"}
      },
      "anyOf": [
        {"required": ["exact", "landing"]},
        {"required": ["prefix", "suffix", "replaceSuffixWith"]},
        {"required": ["prefix", "suffix", "landing"]}
      ]
    }
  }
}
