{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://catalog.lintel.tools/schemas/schemastore/universal-schedule-format/latest.json",
  "title": "Universal Schedule Format (USF)",
  "description": "A compact and efficient format for storing school schedules.",
  "x-lintel": {
    "source": "https://raw.githubusercontent.com/USF-org/USF/refs/heads/main/usf.schema.json",
    "sourceSha256": "4fe9b57da4471029751c322abb7ce5755eb791a45f05869f45e23f182c29dae7",
    "fileMatch": [
      "*.usf",
      "*.usf.yml",
      "*.usf.yaml",
      "*.usf.json",
      ".usf.yml",
      ".usf.yaml",
      ".usf.json",
      "usf.yml",
      "usf.yaml",
      "usf.json"
    ],
    "parsers": [
      "json",
      "yaml"
    ]
  },
  "type": "object",
  "properties": {
    "version": {
      "type": "integer",
      "description": "USF version"
    },
    "subjects": {
      "type": "object",
      "description": "Mapping of subject names to their details.",
      "additionalProperties": {
        "type": "object",
        "properties": {
          "simplified_name": {
            "type": "string"
          },
          "teacher": {
            "type": "string"
          },
          "room": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    "periods": {
      "type": "array",
      "items": {
        "type": "array",
        "maxItems": 2,
        "minItems": 2,
        "prefixItems": [
          {
            "type": "string",
            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d$"
          },
          {
            "type": "string",
            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d$"
          }
        ]
      },
      "description": "List of time periods, each containing a start and end time."
    },
    "timetable": {
      "type": "array",
      "items": {
        "type": "array",
        "maxItems": 4,
        "minItems": 4,
        "prefixItems": [
          {
            "type": "integer",
            "minimum": 1,
            "maximum": 7,
            "description": "Day of the week (1=Monday, 7=Sunday)."
          },
          {
            "type": "string",
            "enum": [
              "all",
              "even",
              "odd"
            ],
            "description": "Week type."
          },
          {
            "type": "string",
            "description": "Subject name (must match keys in 'subjects')."
          },
          {
            "type": "integer",
            "minimum": 1,
            "description": "Class period (1-based index, must match 'periods')."
          }
        ]
      },
      "description": "Schedule entries, each defining a class occurrence."
    }
  },
  "required": [
    "version",
    "subjects",
    "periods",
    "timetable"
  ],
  "additionalProperties": false
}
