{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://github.com/tt-a1i/archify/schemas/lifecycle.schema.json",
  "title": "Archify Lifecycle Diagram",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema_version",
    "diagram_type",
    "meta",
    "lanes",
    "states",
    "transitions"
  ],
  "properties": {
    "schema_version": {
      "enum": [
        1,
        2
      ]
    },
    "diagram_type": {
      "const": "lifecycle"
    },
    "meta": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "title",
        "output"
      ],
      "properties": {
        "title": {
          "type": "string",
          "minLength": 1
        },
        "locale": {
          "$ref": "common.schema.json#/$defs/locale"
        },
        "translations": {
          "$ref": "common.schema.json#/$defs/translations"
        },
        "subtitle": {
          "type": "string"
        },
        "output": {
          "$ref": "common.schema.json#/$defs/portableOutputPath"
        },
        "animation": {
          "$ref": "common.schema.json#/$defs/animation"
        },
        "visual_preset": {
          "$ref": "common.schema.json#/$defs/visualPreset"
        },
        "quality_profile": {
          "$ref": "common.schema.json#/$defs/qualityProfile"
        },
        "repository": {
          "$ref": "common.schema.json#/$defs/repository"
        },
        "views": {
          "$ref": "common.schema.json#/$defs/guidedViews"
        },
        "legend": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "mode": { "$ref": "common.schema.json#/$defs/legendMode" },
            "entries": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "start": { "$ref": "common.schema.json#/$defs/legendEntry" },
                "active": { "$ref": "common.schema.json#/$defs/legendEntry" },
                "waiting": { "$ref": "common.schema.json#/$defs/legendEntry" },
                "decision": { "$ref": "common.schema.json#/$defs/legendEntry" },
                "success": { "$ref": "common.schema.json#/$defs/legendEntry" },
                "failure": { "$ref": "common.schema.json#/$defs/legendEntry" },
                "neutral": { "$ref": "common.schema.json#/$defs/legendEntry" },
                "external": { "$ref": "common.schema.json#/$defs/legendEntry" }
              }
            }
          }
        },
        "viewBox": {
          "type": "array",
          "prefixItems": [
            {
              "type": "number",
              "minimum": 420
            },
            {
              "type": "number",
              "minimum": 300
            }
          ],
          "items": false,
          "minItems": 2,
          "maxItems": 2
        }
      }
    },
    "lanes": {
      "type": "array",
      "minItems": 1,
      "maxItems": 4,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "label"
        ],
        "properties": {
          "id": {
            "$ref": "common.schema.json#/$defs/id"
          },
          "label": {
            "type": "string",
            "minLength": 1
          }
        }
      }
    },
    "states": {
      "type": "array",
      "minItems": 2,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "type",
          "label",
          "lane",
          "col"
        ],
        "properties": {
          "id": {
            "$ref": "common.schema.json#/$defs/id"
          },
          "type": {
            "enum": [
              "start",
              "active",
              "waiting",
              "decision",
              "success",
              "failure",
              "neutral",
              "external"
            ]
          },
          "label": {
            "type": "string",
            "minLength": 1
          },
          "sublabel": {
            "type": "string"
          },
          "tag": {
            "type": "string"
          },
          "icon": { "$ref": "common.schema.json#/$defs/nodeIcon" },
          "brand": {
            "$ref": "common.schema.json#/$defs/brandMark"
          },
          "sources": {
            "$ref": "common.schema.json#/$defs/sourceReferences"
          },
          "step": {
            "type": "string"
          },
          "lane": {
            "$ref": "common.schema.json#/$defs/id"
          },
          "col": {
            "type": "integer",
            "minimum": 0,
            "maximum": 4
          },
          "width": {
            "type": "number",
            "minimum": 48
          },
          "height": {
            "type": "number",
            "minimum": 36
          },
          "yOffset": {
            "type": "number"
          }
        }
      }
    },
    "transitions": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "from",
          "to"
        ],
        "properties": {
          "id": {
            "$ref": "common.schema.json#/$defs/id"
          },
          "from": {
            "$ref": "common.schema.json#/$defs/id"
          },
          "to": {
            "$ref": "common.schema.json#/$defs/id"
          },
          "label": {
            "type": "string"
          },
          "note": {
            "type": "string"
          },
          "variant": {
            "$ref": "common.schema.json#/$defs/variant"
          },
          "route": {
            "enum": [
              "auto",
              "straight",
              "drop",
              "bottom-channel",
              "top-channel",
              "right-channel",
              "left-channel"
            ]
          },
          "fromSide": {
            "$ref": "common.schema.json#/$defs/side"
          },
          "toSide": {
            "$ref": "common.schema.json#/$defs/side"
          },
          "channelX": {
            "type": "number"
          },
          "channelY": {
            "type": "number"
          },
          "cornerRadius": {
            "type": "number",
            "minimum": 0
          },
          "labelAt": {
            "$ref": "common.schema.json#/$defs/point"
          },
          "labelDx": {
            "type": "number"
          },
          "labelDy": {
            "type": "number"
          },
          "labelSegment": {
            "type": "integer",
            "minimum": 0
          },
          "via": {
            "type": "array",
            "items": {
              "$ref": "common.schema.json#/$defs/point"
            }
          },
          "width": {
            "$ref": "common.schema.json#/$defs/relationshipWidth"
          }
        }
      }
    },
    "cards": {
      "$ref": "common.schema.json#/$defs/cards"
    }
  }
}
