{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://arr.local/contracts/booking-row-parse-result.schema.json",
  "title": "ARR Booking Source Row Parse Result",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "result_schema_version",
    "status",
    "source_row",
    "processor_version",
    "rule_set_sha256",
    "group_code_raw",
    "group_code_key",
    "type_of_room_raw",
    "no_of_rooms",
    "room_items",
    "warnings",
    "errors"
  ],
  "properties": {
    "result_schema_version": {
      "const": "1.0"
    },
    "status": {
      "enum": ["accepted", "needs_review", "failed"]
    },
    "source_row": {
      "type": "object",
      "additionalProperties": false,
      "required": ["worksheet", "row_no", "sha256"],
      "properties": {
        "worksheet": {
          "type": "string",
          "minLength": 1
        },
        "row_no": {
          "type": "integer",
          "minimum": 1
        },
        "sha256": {
          "$ref": "#/$defs/sha256"
        }
      }
    },
    "processor_version": {
      "type": "string",
      "minLength": 1
    },
    "rule_set_sha256": {
      "$ref": "#/$defs/sha256"
    },
    "group_code_raw": {
      "type": "string",
      "minLength": 1
    },
    "group_code_key": {
      "type": "string",
      "minLength": 1
    },
    "type_of_room_raw": {
      "type": "string",
      "minLength": 1
    },
    "no_of_rooms": {
      "type": "integer",
      "minimum": 1
    },
    "room_items": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/roomItem"
      }
    },
    "warnings": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/message"
      }
    },
    "errors": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/message"
      }
    }
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "status": {
            "const": "accepted"
          }
        }
      },
      "then": {
        "properties": {
          "room_items": {
            "minItems": 1
          },
          "errors": {
            "maxItems": 0
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "status": {
            "const": "failed"
          }
        }
      },
      "then": {
        "properties": {
          "errors": {
            "minItems": 1
          }
        }
      }
    }
  ],
  "$defs": {
    "sha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    },
    "message": {
      "type": "object",
      "additionalProperties": false,
      "required": ["code", "message"],
      "properties": {
        "code": {
          "type": "string",
          "minLength": 1
        },
        "message": {
          "type": "string"
        }
      }
    },
    "roomItem": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "item_no",
        "room_type_raw",
        "room_type_code",
        "quantity",
        "unit_price",
        "currency_code",
        "price_token_raw",
        "source_fragment"
      ],
      "properties": {
        "item_no": {
          "type": "integer",
          "minimum": 1
        },
        "room_type_raw": {
          "type": "string",
          "minLength": 1
        },
        "room_type_code": {
          "type": ["string", "null"],
          "minLength": 1
        },
        "quantity": {
          "type": "integer",
          "minimum": 1
        },
        "unit_price": {
          "type": ["number", "null"],
          "minimum": 0
        },
        "currency_code": {
          "type": ["string", "null"],
          "pattern": "^[A-Z]{3}$"
        },
        "price_token_raw": {
          "type": ["string", "null"]
        },
        "source_fragment": {
          "type": "string"
        }
      }
    }
  }
}
