{
	"$id": "workout",
	"$schema": "https://json-schema.org/draft/2020-12/schema",
	"type": "object",
	"unevaluatedProperties": false,
	"properties": {
		"name": {
			"type": "string"
		},
		"description": {
			"type": "string"
		},
		"created": {
			"type": "string",
			"format": "date-time"
		},
		"modified": {
			"type": "string",
			"format": "date-time"
		},
		"location": {
			"$ref": "#/$defs/locationOrUriReference"
		},
		"authors": {
			"type": "array",
			"items": {
				"$ref": "#/$defs/author"
			}
		},
		"goals": {
			"$ref": "#/$defs/goals"
		},
		"tips": {
			"type": "array",
			"items": {
				"type": "string"
			}
		},
		"conditionalCapabilities": {
			"type": "array",
			"items": {
				"$ref": "#/$defs/conditionalCapability"
			}
		},
		"blocks": {
			"type": "array",
			"items": {
				"$ref": "#/$defs/block"
			}
		},
		"tags": {
			"type": "array",
			"items": {
				"type": "string"
			}
		},
		"labels": {
			"type": "array",
			"items": {
				"$ref": "#/$defs/labelOrUriReference"
			}
		},
		"meta": {
			"type": "object"
		}
	},
	"$defs": {
		"absoluteIntensityUnit": {
			"anyOf": [
				{
					"$ref": "#/$defs/unitExertion"
				},
				{
					"$ref": "#/$defs/unitHeartRate"
				},
					{
					"$ref": "#/$defs/unitPace"
				}
			]
		},
		"absoluteRepeatUnit": {
			"anyOf": [
				{
					"$ref": "#/$defs/unitAmount"
				},
				{
					"$ref": "#/$defs/unitLength"
				},
				{
					"$ref": "#/$defs/unitPower"
				},
				{
					"$ref": "#/$defs/unitTime"
				}
			]
		},
		"absoluteResistanceUnit": {
			"anyOf": [
				{
					"$ref": "#/$defs/unitAngle"
				},
				{
					"$ref": "#/$defs/unitLength"
				},
				{
					"$ref": "#/$defs/unitMass"
				},
				{
					"$ref": "#/$defs/unitRange"
				},
				{
					"$ref": "#/$defs/unitVolume"
				}
			]
		},
		"absoluteUnit": {
			"anyOf": [
				{
					"$ref": "#/$defs/unitAmount"
				},
				{
					"$ref": "#/$defs/unitAngle"
				},
				{
					"$ref": "#/$defs/unitExertion"
				},
				{
					"$ref": "#/$defs/unitHeartRate"
				},
				{
					"$ref": "#/$defs/unitLength"
				},
				{
					"$ref": "#/$defs/unitMass"
				},
				{
					"$ref": "#/$defs/unitPace"
				},
				{
					"$ref": "#/$defs/unitPower"
				},
				{
					"$ref": "#/$defs/unitTime"
				},
				{
					"$ref": "#/$defs/unitVolume"
				}
			]
		},
		"absoluteValue": {
			"type": "number",
			"minimum": 0
		},
		"absoluteValues": {
			"type": "array",
			"minItems": 1,
			"items": {
				"$ref": "#/$defs/absoluteValue"
			}
		},
		"aggregate": {
			"enum": ["avg", "count", "max", "min", "sum"]
		},
		"author": {
			"type": "object",
			"required": ["name"],
			"unevaluatedProperties": false,
			"properties": {
				"name": {
					"type": "string"
				},
				"contactDetails": {
					"type": "array",
					"items": {
						"$ref": "#/$defs/contactDetail"
					}
				},
				"meta": {
					"type": "object"
				}
			}
		},
		"block": {
			"anyOf": [
				{
					"$ref": "#/$defs/blockExercise"
				},
				{
					"$ref": "#/$defs/blockGroup"
				}
			]
		},
		"blockExercise": {
			"type": "object",
			"required": ["type", "exercise", "repeat"],
			"unevaluatedProperties": false,
			"properties": {
				"type": {
					"const": "exercise"
				},
				"exercise": {
					"$ref": "#/$defs/exerciseOrUriReference"
				},
				"notes": {
					"type": "string"
				},
				"tempo": {
					"$ref": "#/$defs/tempo"
				},
				"repeat": {
					"$ref": "#/$defs/repeat"
				},
				"timer": {
					"$ref": "#/$defs/timer"
				},
				"recoveryBlock": {
					"$ref": "#/$defs/recoveryBlock"
				},
				"intensity": {
					"$ref": "#/$defs/intensity"
				},
				"loads": {
					"type": "array",
					"items": {
						"$ref": "#/$defs/load"
					}
				},
				"location": {
					"$ref": "#/$defs/locationOrUriReference"
				},
				"route": {
					"type": "array",
					"items": {
						"$ref": "#/$defs/coordinate"
					}
				},
				"meta": {
					"type": "object"
				}
			}
		},
		"blockGroup": {
			"type": "object",
			"required": ["type", "repeat", "blocks"],
			"unevaluatedProperties": false,
			"properties": {
				"type": {
					"const": "group"
				},
				"notes": {
					"type": "string"
				},
				"repeat": {
					"$ref": "#/$defs/repeat"
				},
				"timer": {
					"$ref": "#/$defs/timer"
				},
				"recoveryBlock": {
					"$ref": "#/$defs/recoveryBlock"
				},
				"blocks": {
					"type": "array",
					"items": {
						"$ref": "#/$defs/block"
					}
				},
				"location": {
					"$ref": "#/$defs/locationOrUriReference"
				},
				"meta": {
					"type": "object"
				}
			}
		},
		"conditionalCapability": {
			"enum": ["endurance", "strength", "speed", "power", "flexibility", "balance", "agility"]
		},
		"contactDetail": {
			"type": "object",
			"required": ["name", "value"],
			"unevaluatedProperties": false,
			"properties": {
				"name": {
					"type": "string"
				},
				"value": {
					"type": "string"
				},
				"meta": {
					"type": "object"
				}
			}
		},
		"coordinate": {
			"type": "object",
			"required": ["lat", "long"],
			"unevaluatedProperties": false,
			"properties": {
				"lat": {
					"type": "number",
					"minimum": -90,
					"maximum": 90
				},
				"long": {
					"type": "number",
					"minimum": -180,
					"maximum": 180
				}
			}
		},
		"labelOrUriReference": {
			"anyOf": [
				{
					"$ref": "https://graph.movelapse.com/1.0/schemas/label.json"
				},
				{
					"$ref": "#/$defs/uriReference"
				}
			]
		},
		"load": {
			"type": "object",
			"required": ["equipment"],
			"unevaluatedProperties": false,
			"properties": {
				"equipment": {
					"$ref": "#/$defs/equipmentOrUriReference"
				},
				"resistance": {
					"$ref": "#/$defs/resistance"
				},
				"meta": {
					"type": "object"
				}
			}
		},
		"locationOrUriReference": {
			"anyOf": [
				{
					"$ref": "https://graph.movelapse.com/1.0/schemas/location.json"
				},
				{
					"$ref": "#/$defs/uriReference"
				}
			]
		},
		"equipmentOrUriReference": {
			"anyOf": [
				{
					"$ref": "https://graph.movelapse.com/1.0/schemas/equipment.json"
				},
				{
					"$ref": "#/$defs/uriReference"
				}
			]
		},
		"exerciseOrUriReference": {
			"anyOf": [
				{
					"$ref": "https://graph.movelapse.com/1.0/schemas/exercise.json"
				},
				{
					"$ref": "#/$defs/uriReference"
				}
			]
		},
		"goal": {
			"type": "object",
			"required": ["name", "unit", "value", "aggregate"],
			"unevaluatedProperties": false,
			"properties": {
				"name": {
					"type": "string"
				},
				"notes": {
					"type": "string"
				},
				"unit": {
					"$ref": "#/$defs/absoluteUnit"
				},
				"value": {
					"$ref": "#/$defs/relativeValue"
				},
				"aggregate": {
					"$ref": "#/$defs/aggregate"
				},
				"meta": {
					"type": "object"
				}
			}
		},
		"goals": {
			"type": "object",
			"unevaluatedProperties": false,
			"patternProperties": {
				"^[a-z]{1}[a-zA-Z0-9]+$": {
					"$ref": "#/$defs/goal"
				}
			}
		},
		"intensity": {
			"type": "object",
			"required": ["unit", "values"],
			"unevaluatedProperties": false,
			"properties": {
				"unit": {
					"$ref": "#/$defs/intensityUnit"
				},
				"values": {
					"$ref": "#/$defs/values"
				}
			}
		},
		"intensityUnit": {
			"anyOf": [
				{
					"$ref": "#/$defs/relativeIntensityUnitOrUriReference"
				},
				{
					"$ref": "#/$defs/absoluteIntensityUnit"
				}
			]
		},
		"recoveryOrUriReference": {
			"anyOf": [
				{
					"$ref": "https://graph.movelapse.com/1.0/schemas/recovery.json"
				},
				{
					"$ref": "#/$defs/uriReference"
				}
			]
		},
		"recoveryBlock": {
			"type": "object",
			"required": ["recovery", "repeat"],
			"unevaluatedProperties": false,
			"properties": {
				"recovery": {
					"$ref": "#/$defs/recoveryOrUriReference"
				},
				"repeat": {
					"$ref": "#/$defs/repeat"
				},
				"notes": {
					"type": "string"
				},
				"meta": {
					"type": "object"
				}
			}
		},
		"reference": {
			"type": "string",
			"pattern": "^#[a-zA-Z0-9]+$"
		},
		"relativeIntensityUnitOrUriReference": {
			"anyOf": [
				{
					"$ref": "https://graph.movelapse.com/1.0/schemas/relative-intensity-unit.json"
				},
				{
					"$ref": "#/$defs/uriReference"
				}
			]
		},
		"relativeRepeatUnitOrUriReference": {
			"anyOf": [
				{
					"$ref": "https://graph.movelapse.com/1.0/schemas/relative-repeat-unit.json"
				},
				{
					"$ref": "#/$defs/uriReference"
				}
			]
		},
		"relativeResistanceUnitOrUriReference": {
			"anyOf": [
				{
					"$ref": "https://graph.movelapse.com/1.0/schemas/relative-resistance-unit.json"
				},
				{
					"$ref": "#/$defs/uriReference"
				}
			]
		},
		"relativeValue": {
			"enum": ["max", "min"]
		},
		"remainderRecovery": {
			"type": "object",
			"required": ["exercise"],
			"unevaluatedProperties": false,
			"properties": {
				"exercise": {
					"$ref": "#/$defs/exerciseOrUriReference"
				},
				"notes": {
					"type": "string"
				},
				"tempo": {
					"$ref": "#/$defs/tempo"
				},
				"intensity": {
					"$ref": "#/$defs/intensity"
				},
				"loads": {
					"type": "array",
					"items": {
						"$ref": "#/$defs/load"
					}
				},
				"location": {
					"$ref": "#/$defs/locationOrUriReference"
				},
				"route": {
					"type": "array",
					"items": {
						"$ref": "#/$defs/coordinate"
					}
				},
				"meta": {
					"type": "object"
				}
			}
		},
		"repeat": {
			"type": "object",
			"required": ["unit", "values"],
			"unevaluatedProperties": false,
			"properties": {
				"unit": {
					"$ref": "#/$defs/repeatUnit"
				},
				"values": {
					"$ref": "#/$defs/values"
				}
			}
		},
		"repeatUnit": {
			"anyOf": [
				{
					"$ref": "#/$defs/relativeRepeatUnitOrUriReference"
				},
				{
					"$ref": "#/$defs/absoluteRepeatUnit"
				}
			]
		},
		"resistance": {
			"type": "object",
			"required": ["unit", "values"],
			"unevaluatedProperties": false,
			"properties": {
				"unit": {
					"$ref": "#/$defs/resistanceUnit"
				},
				"values": {
					"$ref": "#/$defs/values"
				}
			}
		},
		"resistanceUnit": {
			"anyOf": [
				{
					"$ref": "#/$defs/relativeResistanceUnitOrUriReference"
				},
				{
					"$ref": "#/$defs/absoluteResistanceUnit"
				}
			]
		},
		"tempo": {
			"type": "string",
			"pattern": "^@[0-9]{2}[0-9X][0-9]$"
		},
		"timer": {
			"type": "object",
			"required": ["unit", "values", "recovery"],
			"unevaluatedProperties": false,
			"properties": {
				"unit": {
					"$ref": "#/$defs/unitTime"
				},
				"values": {
					"$ref": "#/$defs/absoluteValues"
				},
				"recovery": {
					"$ref": "#/$defs/recoveryOrUriReference"
				},
				"meta": {
					"type": "object"
				}
			}
		},
		"unitAmount": {
			"enum": ["repetition"]
		},
		"unitAngle": {
			"enum": ["radian", "degree"]
		},
		"unitExertion": {
			"enum": ["rpe"]
		},
		"unitHeartRate": {
			"enum": ["bpm"]
		},
		"unitLength": {
			"enum": ["centimeter", "meter", "kilometer", "inch", "foot", "yard", "mile"]
		},
		"unitMass": {
			"enum": ["kilogram", "pound"]
		},
		"unitPace": {
			"enum": ["min/km", "min/mile"]
		},
		"unitPower": {
			"enum": ["watt"]
		},
		"unitRange": {
			"enum": ["level", "percent"]
		},
		"unitTime": {
			"enum": ["second", "minute", "hour"]
		},
		"unitVolume": {
			"enum": ["cubic meter", "liter"]
		},
		"value": {
			"anyOf": [
				{
					"$ref": "#/$defs/relativeValue"
				},
				{
					"$ref": "#/$defs/absoluteValue"
				}
			]
		},
		"uriReference": {
			"type": "string",
			"format": "uri-reference"
		},
		"values": {
			"type": "array",
			"minItems": 1,
			"items": {
				"$ref": "#/$defs/value"
			}
		}
	}
}