{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "id": "https://www.swiss-hotels.com/schema#",
    "definitions": {
        "destinationCity": {
            "type": "object",
            "properties": {
                "cityId": {
                    "type": "string"
                }
            },
            "required": [
                "cityId"
            ]
        },
        "destinationRegion": {
            "type": "object",
            "properties": {
                "regionId": {
                    "type": "string"
                }
            },
            "required": [
                "regionId"
            ]
        },
        "destinationGroup": {
            "type": "object",
            "properties": {
                "groupId": {
                    "type": "string"
                }
            },
            "required": [
                "groupId"
            ]
        },
        "destinationHotel": {
            "type": "object",
            "properties": {
                "hotelId": {
                    "type": "string"
                }
            },
            "required": [
                "hotelId"
            ]
        },
        "occupancyRoom": {
            "type": "object",
            "properties": {
                "adults": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 5
                },
                "children": {
                    "type": "array",
                    "minItems": 0,
                    "maxItems": 5,
                    "items": {
                        "type": "object",
                        "properties": {
                            "age": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 12
                            }
                        },
                        "required": [
                            "age"
                        ]
                    }
                }
            },
            "required": [
                "adults"
            ]
        },
        "destination": {
            "type": "object",
            "oneOf": [
                {
                    "$ref": "#/definitions/destinationCity"
                },
                {
                    "$ref": "#/definitions/destinationRegion"
                },
                {
                    "$ref": "#/definitions/destinationGroup"
                },
                {
                    "$ref": "#/definitions/destinationHotel"
                }
            ]
        },
        "periodOfStay": {
            "type": "object",
            "properties": {
                "checkInDate": {
                    "type": "string",
                    "format": "date"
                },
                "checkOutDate": {
                    "type": "string",
                    "format": "date"
                }
            },
            "required": [
                "checkInDate",
                "checkOutDate"
            ]
        },
        "occupancy": {
            "type": "object",
            "properties": {
                "rooms": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 5,
                    "items": {
                        "$ref": "#/definitions/occupancyRoom"
                    }
                }
            },
            "required": [
                "rooms"
            ]
        },
        "locale": {
            "type": "string",
            "pattern": "^[a-z]{2}_[A-Z]{2}$"
        },
        "currency": {
            "type": "string",
            "enum": [
                "CHF",
                "EUR",
                "GBP",
                "RUB",
                "USD"
            ]
        },
        "cost": {
            "type": "object",
            "properties": {
                "currency": {
                    "$ref": "#/definitions/currency"
                },
                "amount": {
                    "type": "string",
                    "pattern": "^[0-9]+\\.[0-9]{2}$"
                }
            },
            "required": [
                "currency",
                "amount"
            ]
        },
        "localizedText": {
            "type": "object",
            "properties": {
                "locale": {
                    "$ref": "#/definitions/locale"
                },
                "value": {
                    "type": "string"
                }
            },
            "required": [
                "locale",
                "value"
            ]
        },
        "multilangText": {
            "type": "array",
            "items": {
                "$ref": "#/definitions/localizedText"
            },
            "minItems": 1
        }
    },
    "properties": {
        "destinationCity": {
            "$ref": "#/definitions/destinationCity"
        },
        "destinationRegion": {
            "$ref": "#/definitions/destinationRegion"
        },
        "destinationGroup": {
            "$ref": "#/definitions/destinationGroup"
        },
        "destinationHotel": {
            "$ref": "#/definitions/destinationHotel"
        },
        "occupancyRoom": {
            "$ref": "#/definitions/occupancyRoom"
        },
        "destination": {
            "$ref": "#/definitions/destination"
        },
        "periodOfStay": {
            "$ref": "#/definitions/periodOfStay"
        },
        "occupancy": {
            "$ref": "#/definitions/occupancy"
        },
        "locale": {
            "$ref": "#/definitions/locale"
        },
        "currency": {
            "$ref": "#/definitions/currency"
        },
        "cost": {
            "$ref": "#/definitions/cost"
        },
        "localizedText": {
            "$ref": "#/definitions/localizedText"
        },
        "multilangText": {
            "$ref": "#/definitions/multilangText"
        }
    },
    "required": [
        "destinationCity",
        "destinationRegion",
        "destinationGroup",
        "destinationHotel",
        "occupancyRoom",
        "destination",
        "periodOfStay",
        "occupancy",
        "locale",
        "currency",
        "cost",
        "localizedText",
        "multilangText"
    ]
}