{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://lejia.local/schema/lwts-v1.0.schema.json",
  "title": "LWTS v1.0",
  "type": "object",
  "additionalProperties": false,
  "required": ["schema", "schemaVersion", "template", "nodes", "events"],
  "properties": {
    "schema": { "const": "lwts" },
    "schemaVersion": { "const": "1.0" },
    "template": { "$ref": "#/$defs/template" },
    "nodes": { "type": "array", "items": { "$ref": "#/$defs/node" } },
    "events": { "type": "array", "items": { "$ref": "#/$defs/event" } },
    "relations": { "type": "array", "items": { "$ref": "#/$defs/relation" } },
    "nodeStartConditions": {
      "type": "array",
      "items": { "$ref": "#/$defs/condition" }
    },
    "reminderRules": {
      "type": "array",
      "items": { "$ref": "#/$defs/reminder" }
    },
    "extensions": { "type": "object" }
  },
  "$defs": {
    "key": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_]*$",
      "maxLength": 80
    },
    "text": { "type": "string", "minLength": 1, "maxLength": 200 },
    "template": {
      "type": "object",
      "additionalProperties": false,
      "required": ["key", "name", "description", "version"],
      "properties": {
        "key": { "$ref": "#/$defs/key" },
        "name": { "$ref": "#/$defs/text" },
        "description": { "type": ["string", "null"], "maxLength": 200 },
        "version": { "type": "integer", "minimum": 1 }
      }
    },
    "node": {
      "type": "object",
      "additionalProperties": false,
      "required": ["key", "name", "description", "order", "startStrategy"],
      "properties": {
        "key": { "$ref": "#/$defs/key" },
        "name": { "$ref": "#/$defs/text" },
        "description": { "type": ["string", "null"], "maxLength": 200 },
        "order": { "type": "integer", "minimum": 0 },
        "startStrategy": { "enum": ["auto", "manual"] }
      }
    },
    "event": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "key",
        "nodeKey",
        "name",
        "description",
        "order",
        "expectedDurationDays",
        "preconditionMode",
        "preconditionStrategy",
        "flowRole"
      ],
      "properties": {
        "key": { "$ref": "#/$defs/key" },
        "nodeKey": { "$ref": "#/$defs/key" },
        "name": { "$ref": "#/$defs/text" },
        "description": { "type": ["string", "null"], "maxLength": 200 },
        "order": { "type": "integer", "minimum": 0 },
        "expectedDurationDays": {
          "type": "integer",
          "minimum": 0,
          "maximum": 3650
        },
        "preconditionMode": { "enum": ["all", "any"] },
        "preconditionStrategy": { "enum": ["auto", "none", "manual"] },
        "flowRole": { "enum": ["main", "side"] }
      }
    },
    "relation": {
      "type": "object",
      "additionalProperties": false,
      "required": ["key", "fromEventKey", "toEventKey", "type", "offsetDays"],
      "properties": {
        "key": { "$ref": "#/$defs/key" },
        "fromEventKey": { "$ref": "#/$defs/key" },
        "toEventKey": { "$ref": "#/$defs/key" },
        "type": { "enum": ["interval", "mustFinishBefore"] },
        "offsetDays": { "type": "integer", "minimum": -3650, "maximum": 3650 }
      }
    },
    "condition": {
      "type": "object",
      "additionalProperties": false,
      "required": ["key", "targetNodeKey", "sourceEventKey"],
      "properties": {
        "key": { "$ref": "#/$defs/key" },
        "targetNodeKey": { "$ref": "#/$defs/key" },
        "sourceEventKey": { "$ref": "#/$defs/key" }
      }
    },
    "reminder": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "key",
        "eventKey",
        "offsetDays",
        "time",
        "message",
        "enabled"
      ],
      "properties": {
        "key": { "$ref": "#/$defs/key" },
        "eventKey": { "$ref": "#/$defs/key" },
        "offsetDays": { "type": "integer", "minimum": -3650, "maximum": 3650 },
        "time": { "type": "string", "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$" },
        "message": { "$ref": "#/$defs/text" },
        "enabled": { "type": "boolean" }
      }
    }
  }
}
