{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://developers.mouve.it/schemas/venue-import-v1.json",
  "title": "Mouve venue import row (v1)",
  "description": "One row of a JSON Lines import file. Every line is one JSON object validated against this schema. external_id is the row's stable id in the old system: a re-run updates the row instead of adding a copy. Import is a v2 preview and not available yet.",
  "type": "object",
  "required": ["type", "external_id"],
  "oneOf": [
    { "$ref": "#/$defs/spaceRow" },
    { "$ref": "#/$defs/hoursRow" },
    { "$ref": "#/$defs/priceRuleRow" },
    { "$ref": "#/$defs/memberRow" },
    { "$ref": "#/$defs/bookingRow" }
  ],
  "$defs": {
    "externalId": { "type": "string", "minLength": 1, "maxLength": 120 },
    "time": {
      "type": "string",
      "pattern": "^(([01][0-9]|2[0-3]):[0-5][0-9]|24:00)$"
    },
    "weekday": { "enum": ["mon", "tue", "wed", "thu", "fri", "sat", "sun"] },
    "instant": {
      "type": "string",
      "description": "RFC 3339 date-time with an offset.",
      "format": "date-time",
      "pattern": "(Z|[+-][0-9]{2}:[0-9]{2})$"
    },
    "spaceRow": {
      "type": "object",
      "additionalProperties": false,
      "required": ["type", "external_id", "name", "sport"],
      "properties": {
        "type": { "const": "space" },
        "external_id": { "$ref": "#/$defs/externalId" },
        "name": { "type": "string", "minLength": 1, "maxLength": 80 },
        "kind": { "enum": ["court", "room", "zone", "lane"] },
        "sport": { "type": "string", "minLength": 2, "maxLength": 40 },
        "surface": { "type": "string", "maxLength": 40 },
        "indoor": { "type": "boolean" },
        "capacity": { "type": "integer", "minimum": 1, "maximum": 1000 }
      }
    },
    "hoursRow": {
      "type": "object",
      "additionalProperties": false,
      "required": ["type", "external_id", "weekday", "opens", "closes"],
      "properties": {
        "type": { "const": "hours" },
        "external_id": { "$ref": "#/$defs/externalId" },
        "space_external_id": { "$ref": "#/$defs/externalId" },
        "weekday": { "$ref": "#/$defs/weekday" },
        "opens": { "$ref": "#/$defs/time" },
        "closes": { "$ref": "#/$defs/time" }
      }
    },
    "priceRuleRow": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "type",
        "external_id",
        "name",
        "weekdays",
        "from",
        "to",
        "amount_minor",
        "currency"
      ],
      "properties": {
        "type": { "const": "price_rule" },
        "external_id": { "$ref": "#/$defs/externalId" },
        "space_external_id": { "$ref": "#/$defs/externalId" },
        "name": { "type": "string", "minLength": 1, "maxLength": 80 },
        "weekdays": {
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": { "$ref": "#/$defs/weekday" }
        },
        "from": { "$ref": "#/$defs/time" },
        "to": { "$ref": "#/$defs/time" },
        "amount_minor": { "type": "integer", "minimum": 0 },
        "currency": { "type": "string", "pattern": "^[A-Z]{3}$" }
      }
    },
    "memberRow": {
      "type": "object",
      "description": "A venue customer record. Not a Mouve user. Gets no email unless the owner chooses to invite the person.",
      "additionalProperties": false,
      "required": ["type", "external_id", "name"],
      "properties": {
        "type": { "const": "member" },
        "external_id": { "$ref": "#/$defs/externalId" },
        "name": { "type": "string", "minLength": 1, "maxLength": 120 },
        "email": { "type": "string", "format": "email", "maxLength": 200 },
        "phone": { "type": "string", "pattern": "^\\+[0-9 ()-]{6,24}$" },
        "marketing_consent": { "type": "boolean", "default": false }
      }
    },
    "bookingRow": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "type",
        "external_id",
        "space_external_id",
        "starts_at",
        "ends_at"
      ],
      "properties": {
        "type": { "const": "booking" },
        "external_id": { "$ref": "#/$defs/externalId" },
        "space_external_id": { "$ref": "#/$defs/externalId" },
        "member_external_id": { "$ref": "#/$defs/externalId" },
        "starts_at": { "$ref": "#/$defs/instant" },
        "ends_at": { "$ref": "#/$defs/instant" },
        "note": { "type": "string", "maxLength": 300 }
      }
    }
  }
}
