{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schema.contextura.io/twin/1.json",
  "title": "Voed je twin",
  "description": "Instellingen, de vaste testvragen van de eigenaar en het log van gestelde vragen om de twin aan te vullen. Nooit de antwoorden zelf: die gaan via de inbox naar notities. Gecontroleerd door de lint (controleerTwin).",
  "type": "object",
  "required": ["versie", "instellingen", "test", "log"],
  "additionalProperties": false,
  "properties": {
    "versie": { "const": 1 },
    "instellingen": {
      "type": "object",
      "required": ["daglimiet", "gesloten"],
      "additionalProperties": false,
      "properties": {
        "daglimiet": { "type": "integer", "minimum": 1, "maximum": 100, "description": "Hoogstens zoveel vragen per dag" },
        "gesloten": { "type": "array", "items": { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" }, "description": "Domeinen (hubs) waarover de twin niets vraagt" }
      }
    },
    "test": {
      "type": "array",
      "description": "De twintig-vragen-test: vragen waarvan de eigenaar het eigen antwoord kent (vorm raad)",
      "items": {
        "type": "object",
        "required": ["id", "vraag", "laag"],
        "additionalProperties": false,
        "properties": {
          "id": { "type": "string", "minLength": 1 },
          "vraag": { "type": "string", "minLength": 1 },
          "laag": { "enum": ["denken", "weten", "oordelen", "ritme"] },
          "domein": { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" }
        }
      }
    },
    "log": {
      "type": "array",
      "description": "Eén regel per gestelde vraag, nieuwste onderaan",
      "items": {
        "type": "object",
        "required": ["id", "datum", "vorm", "laag", "vraag", "status"],
        "additionalProperties": false,
        "properties": {
          "id": { "type": "string", "minLength": 1 },
          "datum": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" },
          "vorm": { "enum": ["dit-of-dat", "waar-niet-waar", "mening", "raad", "gat", "like"] },
          "laag": { "enum": ["denken", "weten", "oordelen", "ritme"] },
          "domein": { "type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$" },
          "bron": { "type": "string", "description": "De notitie waar de vraag uit kwam, of twin.json#<test-id>" },
          "vraag": { "type": "string", "minLength": 1 },
          "status": { "enum": ["beantwoord", "overgeslagen"] },
          "landing": { "type": "string", "description": "Het inbox-bestand met het antwoord (verplicht als beantwoord, behalve bij like)" },
          "score": { "enum": [0, 1, 2], "description": "Alleen bij vorm raad: hoe goed de twin het wist" },
          "reden": { "enum": ["bekend", "irrelevant", "persoonlijk"], "description": "Alleen bij een overgeslagen vraag: waarom" }
        }
      }
    },
    "mijlpalen": {
      "type": "array",
      "description": "De mijlpalen die de gebruiker al gezien heeft (namen, elk een keer)",
      "items": { "type": "string", "minLength": 1 },
      "uniqueItems": true
    },
    "record": {
      "type": "object",
      "description": "Het beste resultaat van een uitdaging",
      "required": ["punten", "datum"],
      "additionalProperties": false,
      "properties": {
        "punten": { "type": "number", "minimum": 0 },
        "datum": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }
      }
    }
  }
}
