{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "additionalProperties": false,
  "required": ["version"],
  "properties": {
    "version": { "const": 1 },
    "hal": { "$ref": "#/$defs/component" },
    "templates": {
      "type": "object",
      "propertyNames": { "$ref": "#/$defs/identifier" },
      "additionalProperties": { "$ref": "#/$defs/template" }
    },
    "prompts": {
      "type": "object",
      "propertyNames": { "$ref": "#/$defs/identifier" },
      "additionalProperties": { "$ref": "#/$defs/instance" }
    }
  },
  "anyOf": [
    { "required": ["templates"] },
    { "required": ["prompts"] }
  ],
  "$defs": {
    "identifier": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$"
    },
    "component": {
      "type": "object",
      "additionalProperties": false,
      "required": ["component"],
      "properties": {
        "component": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$"
        }
      }
    },
    "localized": {
      "oneOf": [
        { "type": "string" },
        {
          "type": "object",
          "minProperties": 1,
          "propertyNames": {
            "type": "string",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"
          },
          "additionalProperties": { "type": "string" }
        }
      ]
    },
    "typedValue": {
      "type": ["boolean", "integer", "number"]
    },
    "pin": {
      "type": "object",
      "additionalProperties": false,
      "required": ["direction", "type"],
      "properties": {
        "direction": { "enum": ["in", "out", "io"] },
        "type": { "enum": ["bit", "s32", "u32", "float"] },
        "trigger": { "const": "rising" },
        "variable": {
          "type": "string",
          "pattern": "^[a-z][a-z0-9_]*$"
        },
        "on_action": {
          "type": "object",
          "minProperties": 1,
          "propertyNames": { "$ref": "#/$defs/identifier" },
          "additionalProperties": { "$ref": "#/$defs/typedValue" }
        },
        "initial": { "$ref": "#/$defs/typedValue" },
        "reset": { "$ref": "#/$defs/typedValue" }
      }
    },
    "halContract": {
      "type": "object",
      "additionalProperties": false,
      "required": ["pins"],
      "properties": {
        "pins": {
          "type": "object",
          "minProperties": 1,
          "propertyNames": {
            "type": "string",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{0,63}$"
          },
          "additionalProperties": { "$ref": "#/$defs/pin" }
        }
      }
    },
    "detail": {
      "type": "object",
      "additionalProperties": false,
      "required": ["label", "value"],
      "properties": {
        "label": { "$ref": "#/$defs/localized" },
        "value": { "type": "string" },
        "when": { "type": "string", "minLength": 1 }
      }
    },
    "action": {
      "type": "object",
      "additionalProperties": false,
      "required": ["id", "label", "intent"],
      "properties": {
        "id": { "$ref": "#/$defs/identifier" },
        "label": { "$ref": "#/$defs/localized" },
        "intent": { "enum": ["primary", "secondary", "danger"] }
      }
    },
    "contentProperties": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "template": { "$ref": "#/$defs/identifier" },
        "hal": { "$ref": "#/$defs/halContract" },
        "title": { "$ref": "#/$defs/localized" },
        "message": { "$ref": "#/$defs/localized" },
        "severity": { "enum": ["info", "success", "warning", "error"] },
        "size": { "enum": ["sm", "md", "lg"] },
        "details": {
          "type": "array",
          "maxItems": 32,
          "items": { "$ref": "#/$defs/detail" }
        },
        "actions": {
          "type": "array",
          "minItems": 1,
          "maxItems": 16,
          "items": { "$ref": "#/$defs/action" }
        },
        "allow_abort": { "type": "boolean" }
      }
    },
    "template": {
      "$ref": "#/$defs/contentProperties"
    },
    "instance": {
      "allOf": [
        { "$ref": "#/$defs/contentProperties" },
        {
          "anyOf": [
            { "required": ["template"] },
            {
              "required": [
                "title",
                "message",
                "severity",
                "actions",
                "allow_abort"
              ]
            }
          ]
        }
      ]
    }
  }
}
