{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Revisync study plan, v1",
  "description": "Study proposals with optional perceived difficulty and advisory planning limits. Never contains completed history or measured time.",
  "type": "object",
  "additionalProperties": false,
  "required": ["format", "version", "groups", "subjects"],
  "properties": {
    "format": {"const": "revisync-study-plan"},
    "version": {"const": 1},
    "title": {"type": "string", "minLength": 1, "maxLength": 120},
    "locale": {"type": "string", "maxLength": 32, "pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$"},
    "reviewSettings": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "shortIntervals": {"$ref": "#/$defs/intervals"},
        "longIntervals": {"$ref": "#/$defs/intervals"}
      },
      "anyOf": [
        {"required": ["shortIntervals"]},
        {"required": ["longIntervals"]}
      ]
    },
    "planningPreferences": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "dailyAvailableMinutes": {"$ref": "#/$defs/minutes"},
        "defaultMinutesPerStudy": {"$ref": "#/$defs/minutes"},
        "maxMinutesPerStudy": {"$ref": "#/$defs/minutes"}
      }
    },
    "groups": {
      "type": "array",
      "maxItems": 120,
      "items": {"$ref": "#/$defs/group"}
    },
    "subjects": {
      "type": "array",
      "minItems": 1,
      "maxItems": 120,
      "items": {"$ref": "#/$defs/subject"}
    }
  },
  "$defs": {
    "text": {"type": "string", "minLength": 1, "maxLength": 160},
    "difficulty": {"type": ["integer", "null"], "minimum": 1, "maximum": 5},
    "minutes": {"type": "integer", "minimum": 1, "maximum": 1440},
    "intervals": {
      "type": "array",
      "minItems": 1,
      "maxItems": 32,
      "uniqueItems": true,
      "items": {"type": "integer", "minimum": 1, "maximum": 3650}
    },
    "group": {
      "type": "object",
      "additionalProperties": false,
      "required": ["name"],
      "properties": {
        "name": {"$ref": "#/$defs/text"},
        "difficulty": {"$ref": "#/$defs/difficulty"}
      }
    },
    "subject": {
      "type": "object",
      "additionalProperties": false,
      "required": ["name", "contents"],
      "properties": {
        "name": {"$ref": "#/$defs/text"},
        "group": {"$ref": "#/$defs/text"},
        "difficulty": {"$ref": "#/$defs/difficulty"},
        "contents": {
          "type": "array",
          "maxItems": 200,
          "items": {"$ref": "#/$defs/content"}
        }
      }
    },
    "content": {
      "type": "object",
      "additionalProperties": false,
      "required": ["title"],
      "allOf": [
        {
          "if": {
            "properties": {"plannedStudies": {"minItems": 1}},
            "required": ["plannedStudies"]
          },
          "then": {"required": ["reviewMode"]}
        },
        {
          "if": {
            "anyOf": [
              {"not": {"required": ["plannedStudies"]}},
              {
                "properties": {"plannedStudies": {"maxItems": 0}},
                "required": ["plannedStudies"]
              }
            ]
          },
          "then": {"not": {"required": ["reviewMode"]}}
        }
      ],
      "properties": {
        "title": {"$ref": "#/$defs/text"},
        "difficulty": {"$ref": "#/$defs/difficulty"},
        "reviewMode": {"enum": ["none", "short", "long"]},
        "plannedStudies": {
          "type": "array",
          "maxItems": 100,
          "items": {"$ref": "#/$defs/plannedStudy"}
        }
      }
    },
    "plannedStudy": {
      "type": "object",
      "additionalProperties": false,
      "required": ["date", "estimatedMinutes"],
      "properties": {
        "date": {
          "type": "string",
          "format": "date",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        "estimatedMinutes": {"$ref": "#/$defs/minutes"}
      }
    }
  }
}
