{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Roamary Import Schema v1",
  "type": "object",
  "required": ["version", "title", "stations"],
  "properties": {
    "version": {
      "type": "string",
      "enum": ["1"],
      "description": "Schema-Version. Pflichtfeld zur Unterscheidung zukünftiger Versionen."
    },
    "title": {
      "type": "string",
      "maxLength": 255,
      "description": "Titel der Reise."
    },
    "description": {
      "type": ["string", "null"],
      "maxLength": 1000,
      "description": "Optionale Beschreibung der Reise."
    },
    "stations": {
      "type": "array",
      "minItems": 1,
      "description": "Liste der Reisestationen in Reihenfolge.",
      "items": {
        "type": "object",
        "required": ["name"],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 255,
            "description": "Name der Station (z.B. Ortsname)."
          },
          "stationType": {
            "type": "string",
            "enum": ["city", "nature", "campsite", "island", "coastal", "other"],
            "default": "city",
            "description": "Typ der Station. Beeinflusst Icon und Filtermöglichkeiten. Standard: \"city\"."
          },
          "latitude": {
            "type": ["number", "null"],
            "description": "Breitengrad (WGS84). Null wenn unbekannt. Muss ein mit dem Wohnmobil erreichbarer Punkt sein (z.B. Parkplatz, Stellplatz, Ortszentrum) — niemals der Gipfel, eine Hütte oder ein anderes nur zu Fuß erreichbares Ziel, da sonst die Routenberechnung einen langen Umweg über das nächste befahrbare Straßennetz einschlägt."
          },
          "longitude": {
            "type": ["number", "null"],
            "description": "Längengrad (WGS84). Null wenn unbekannt. Muss ein mit dem Wohnmobil erreichbarer Punkt sein (z.B. Parkplatz, Stellplatz, Ortszentrum) — niemals der Gipfel, eine Hütte oder ein anderes nur zu Fuß erreichbares Ziel, da sonst die Routenberechnung einen langen Umweg über das nächste befahrbare Straßennetz einschlägt."
          },
          "nights": {
            "type": "integer",
            "minimum": 0,
            "default": 1,
            "description": "Anzahl der Nächte an dieser Station."
          },
          "returnToStation": {
            "type": "boolean",
            "default": false,
            "description": "Nur relevant wenn nights=0. true = Tagesausflug (Rückkehr zur Basisstation); false = Durchfahrtsstopp (Weiterfahrt). Wird bei nights>0 ignoriert."
          },
          "description": {
            "type": ["string", "null"],
            "maxLength": 1000,
            "description": "Optionale Notizen zur Station."
          },
          "pois": {
            "type": "array",
            "description": "Points of Interest an dieser Station.",
            "items": {
              "type": "object",
              "required": ["name", "poiType"],
              "properties": {
                "name": {
                  "type": "string",
                  "maxLength": 255,
                  "description": "Name des POI."
                },
                "poiType": {
                  "type": "string",
                  "enum": ["ATTRACTION", "RESTAURANT", "CAMPSITE", "HOTEL", "PARKING"],
                  "description": "Kategorie des POI."
                },
                "latitude": {
                  "type": ["number", "null"],
                  "description": "Breitengrad (WGS84). Null wenn unbekannt."
                },
                "longitude": {
                  "type": ["number", "null"],
                  "description": "Längengrad (WGS84). Null wenn unbekannt."
                },
                "description": {
                  "type": ["string", "null"],
                  "maxLength": 1000,
                  "description": "Optionale Beschreibung oder Notiz zum POI."
                },
                "openingSchedule": {
                  "type": "array",
                  "description": "Saisonales Öffnungsregelwerk. Jede Regel definiert einen Monatszeitraum und optional Wochentage.",
                  "items": {
                    "type": "object",
                    "required": ["monthsFrom", "monthsTo"],
                    "properties": {
                      "monthsFrom": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 12,
                        "description": "Startmonat (1=Jänner, 12=Dezember)."
                      },
                      "monthsTo": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 12,
                        "description": "Endmonat (inklusiv). Muss >= monthsFrom sein."
                      },
                      "days": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "enum": ["MO", "TU", "WE", "TH", "FR", "SA", "SU"]
                        },
                        "description": "Wochentage. Fehlt das Feld, gilt die Regel für alle Wochentage."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
