{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://bellchain.app/schema/chain-1.json",
  "title": "Bellchain-Kette",
  "description": "Eine Rule Chain aus Nodes und Verbindungen. Version 1 des Kettenformats.",
  "type": "object",
  "required": [
    "name",
    "version",
    "nodes",
    "edges"
  ],
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "type": "string",
      "description": "Optionaler Verweis auf dieses Schema, für Editoren."
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120,
      "description": "Name der Kette, erscheint in Nachrichten als {{kette}}."
    },
    "version": {
      "const": 1,
      "description": "Version des Kettenformats."
    },
    "description": {
      "type": "string",
      "maxLength": 2000
    },
    "meta": {
      "$ref": "#/$defs/meta"
    },
    "nodes": {
      "type": "array",
      "maxItems": 200,
      "items": {
        "$ref": "#/$defs/node"
      }
    },
    "edges": {
      "type": "array",
      "maxItems": 1000,
      "items": {
        "$ref": "#/$defs/edge"
      }
    }
  },
  "$defs": {
    "nodeId": {
      "type": "string",
      "pattern": "^[A-Za-z][A-Za-z0-9_-]{0,31}$",
      "description": "Eindeutig innerhalb der Kette, ohne Punkt."
    },
    "nodeType": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9][a-z0-9-]*)+(@[0-9]+(\\.[0-9]+){0,2})?$",
      "description": "Node-Typ mit Namensraum, optional mit festgehaltener Version: core.rsi oder core.rsi@1."
    },
    "pinRef": {
      "type": "string",
      "pattern": "^[A-Za-z][A-Za-z0-9_-]{0,31}\\.[a-z][A-Za-z0-9]{0,31}$",
      "description": "Node und Pin als id.pin, etwa c1.close."
    },
    "localized": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "de": {
          "type": "string",
          "maxLength": 2000
        },
        "en": {
          "type": "string",
          "maxLength": 2000
        }
      }
    },
    "meta": {
      "type": "object",
      "additionalProperties": false,
      "description": "Angaben für die Vorlagen-Galerie.",
      "properties": {
        "title": {
          "$ref": "#/$defs/localized"
        },
        "description": {
          "$ref": "#/$defs/localized"
        },
        "tags": {
          "type": "array",
          "maxItems": 12,
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 40
          }
        },
        "author": {
          "type": "string",
          "maxLength": 80
        },
        "source": {
          "type": "string",
          "maxLength": 200
        },
        "notes": {
          "type": "object",
          "description": "Text der Notizen je Sprache, nach Node-id. Wer die Vorlage verwendet, bekommt ihn als settings.text in der Sprache der Oberfläche.",
          "maxProperties": 200,
          "propertyNames": {
            "$ref": "#/$defs/nodeId"
          },
          "additionalProperties": {
            "$ref": "#/$defs/localized"
          }
        }
      }
    },
    "node": {
      "type": "object",
      "required": [
        "id",
        "type",
        "position",
        "settings"
      ],
      "additionalProperties": false,
      "properties": {
        "id": {
          "$ref": "#/$defs/nodeId"
        },
        "type": {
          "$ref": "#/$defs/nodeType"
        },
        "position": {
          "type": "object",
          "required": [
            "x",
            "y"
          ],
          "additionalProperties": false,
          "properties": {
            "x": {
              "type": "number"
            },
            "y": {
              "type": "number"
            }
          }
        },
        "settings": {
          "type": "object",
          "propertyNames": {
            "pattern": "^[a-z][a-zA-Z0-9]{0,31}$"
          },
          "additionalProperties": {
            "type": [
              "number",
              "string",
              "boolean"
            ]
          }
        }
      }
    },
    "edge": {
      "type": "object",
      "required": [
        "from",
        "to"
      ],
      "additionalProperties": false,
      "properties": {
        "from": {
          "$ref": "#/$defs/pinRef"
        },
        "to": {
          "$ref": "#/$defs/pinRef"
        }
      }
    }
  }
}
