{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://studynow.app/schema/schulvorlage-3.json",
  "title": "StudyNow Schulvorlage (Format 3)",
  "description": "Eine Klasse bzw. ein Oberstufen-Kursangebot für ein Halbjahr. Normativ ist docs/import/SPEC.md §6b; dieses Schema prüft Aufbau und Wertformen, nicht die Verweise zwischen Listen.",
  "type": "object",
  "required": [
    "format",
    "version",
    "profil",
    "vorlage",
    "schulform",
    "halbjahr",
    "zeitraster",
    "faecher"
  ],
  "properties": {
    "format": {
      "const": "studynow"
    },
    "version": {
      "const": 3
    },
    "profil": {
      "const": "schulvorlage"
    },
    "vorlage": {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "$ref": "#/$defs/kennung"
        },
        "herausgeber": {
          "type": "string"
        }
      }
    },
    "schulform": {
      "enum": [
        "klasse",
        "oberstufe"
      ]
    },
    "halbjahr": {
      "type": "object",
      "required": [
        "name",
        "schuljahr",
        "nummer",
        "beginn",
        "ende"
      ],
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1
        },
        "schuljahr": {
          "type": "string",
          "minLength": 1
        },
        "nummer": {
          "enum": [
            1,
            2
          ]
        },
        "beginn": {
          "$ref": "#/$defs/datum"
        },
        "ende": {
          "$ref": "#/$defs/datum"
        },
        "klasse": {
          "type": "string"
        },
        "jahrgang": {
          "type": "integer",
          "minimum": 1,
          "maximum": 13
        },
        "phase": {
          "type": "string"
        }
      }
    },
    "zeitzone": {
      "type": "string"
    },
    "zeitraster": {
      "type": "object",
      "required": [
        "stunden"
      ],
      "properties": {
        "stunden": {
          "$ref": "#/$defs/stunden"
        },
        "abweichungen": {
          "type": "object",
          "patternProperties": {
            "^[1-7]$": {
              "$ref": "#/$defs/stunden"
            }
          },
          "additionalProperties": false
        }
      }
    },
    "abWochen": {
      "type": "object",
      "required": [
        "anker",
        "ankerWoche",
        "wochen"
      ],
      "properties": {
        "art": {
          "enum": [
            "ab",
            "kw"
          ],
          "description": "ab: A/B ab einer Ankerwoche (Standard); kw: A = ungerade, B = gerade Kalenderwoche (seit App-Version 6.10.2)"
        },
        "anker": {
          "$ref": "#/$defs/datum"
        },
        "ankerWoche": {
          "enum": [
            "A",
            "B"
          ]
        },
        "ferienZaehlen": {
          "type": "boolean"
        },
        "wochen": {
          "type": "object",
          "patternProperties": {
            "^\\d{4}-\\d{2}-\\d{2}$": {
              "enum": [
                "A",
                "B"
              ]
            }
          },
          "additionalProperties": false
        }
      }
    },
    "ferien": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "bezeichnung",
          "beginn",
          "ende"
        ],
        "properties": {
          "id": {
            "$ref": "#/$defs/kennung"
          },
          "bezeichnung": {
            "type": "string",
            "minLength": 1
          },
          "beginn": {
            "$ref": "#/$defs/datum"
          },
          "ende": {
            "$ref": "#/$defs/datum"
          }
        }
      }
    },
    "termine": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "bezeichnung",
          "beginn"
        ],
        "properties": {
          "id": {
            "$ref": "#/$defs/kennung"
          },
          "bezeichnung": {
            "type": "string",
            "minLength": 1
          },
          "beginn": {
            "$ref": "#/$defs/datum"
          },
          "ende": {
            "$ref": "#/$defs/datum"
          },
          "unterrichtsfrei": {
            "type": "boolean"
          }
        }
      }
    },
    "faecher": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": [
          "id",
          "name"
        ],
        "properties": {
          "id": {
            "$ref": "#/$defs/kennung"
          },
          "name": {
            "type": "string",
            "minLength": 1
          },
          "kurzform": {
            "type": "string"
          },
          "farbe": {
            "type": "string"
          },
          "kurscode": {
            "type": "string"
          },
          "niveau": {
            "type": "string"
          },
          "wahlgruppe": {
            "type": "string"
          },
          "lehrkraft": {
            "type": "string"
          },
          "raum": {
            "type": "string"
          }
        }
      }
    },
    "unterricht": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "fach",
          "wochentag",
          "stunde"
        ],
        "properties": {
          "id": {
            "$ref": "#/$defs/kennung"
          },
          "fach": {
            "$ref": "#/$defs/kennung"
          },
          "wochentag": {
            "type": "integer",
            "minimum": 1,
            "maximum": 7
          },
          "stunde": {
            "type": "integer",
            "minimum": 1
          },
          "woche": {
            "enum": [
              "A",
              "B"
            ]
          },
          "raum": {
            "type": "string"
          }
        }
      }
    }
  },
  "$defs": {
    "kennung": {
      "type": "string",
      "minLength": 1
    },
    "datum": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "uhrzeit": {
      "type": "string",
      "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
    },
    "stunden": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": [
          "nr",
          "beginn",
          "ende"
        ],
        "properties": {
          "nr": {
            "type": "integer",
            "minimum": 1
          },
          "beginn": {
            "$ref": "#/$defs/uhrzeit"
          },
          "ende": {
            "$ref": "#/$defs/uhrzeit"
          }
        }
      }
    }
  }
}
