{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://imde.io/schema/3.1/IMDEMessages.json",
  "title": "IMDEMessages",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "IMDEMessages"
  ],
  "properties": {
    "$schema": {
      "type": "string"
    },
    "IMDEMessages": {
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "#/$defs/IMDEMessage"
      }
    }
  },

  "$defs": {

    "IMDEMessage": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "Header"
      ],
      "properties": {
        "Header": {
          "$ref": "#/$defs/Header"
        },

        "Item": {
          "$ref": "#/$defs/Item"
        },

        "PackagingSystem": {
          "$ref": "#/$defs/PackagingSystem"
        },

        "BOM": {
          "$ref": "#/$defs/BOM"
        }
      },

      "oneOf": [
        {
          "required": [ "Item" ],
          "not": {
            "anyOf": [
              { "required": [ "BOM" ] },
              { "required": [ "PackagingSystem" ] }
            ]
          }
        },
        {
          "required": [ "BOM" ],
          "not": {
            "anyOf": [
              { "required": [ "Item" ] },
              { "required": [ "PackagingSystem" ] }
            ]
          }
        },
        {
          "required": [ "PackagingSystem" ],
          "not": {
            "anyOf": [
              { "required": [ "Item" ] },
              { "required": [ "BOM" ] }
            ]
          }
        }
      ]
    },

    "Header": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "DataSender",
        "DataReceiver",
        "DataProvider",
        "MessageIdentifier",
        "CreationDateTime"
      ],
      "properties": {
        "DataSender": {
          "$ref": "#/$defs/Party"
        },

        "DataReceiver": {
          "$ref": "#/$defs/Party"
        },

        "DataProvider": {
          "$ref": "#/$defs/DataProvider"
        },

        "MessageIdentifier": {
          "type": "string"
        },

        "CreationDateTime": {
          "type": "string",
          "format": "date-time"
        },

        "Parameters": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "Parameter"
          ],
          "properties": {
            "Parameter": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/$defs/Parameter"
              }
            }
          }
        },

        "DataContainerType": {
          "$ref": "https://imde.io/schema/azlon/1.1/codelists/dataContainerType.json"
        }
      }
    },

    "Party": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "Identifiers": {
          "$ref": "#/$defs/PartyIdentifiers"
        }
      }
    },

    "DataProvider": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "Name"
      ],
      "properties": {
        "Identifiers": {
          "$ref": "#/$defs/PartyIdentifiers"
        },
        "Name": {
          "type": "string"
        }
      }
    },

    "Parameter": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "Key",
        "Value"
      ],
      "properties": {
        "Key": {
          "type": "string"
        },
        "Value": {
          "type": "string"
        }
      }
    },

    "PartyIdentifiers": {
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "#/$defs/PartyIdentifier"
      }
    },

    "PartyIdentifier": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "Type",
        "Value"
      ],
      "properties": {
        "Type": {
          "$ref": "https://imde.io/schema/azlon/1.0/codelists/partyIdentifierType.json"
        },

        "Value": {
          "type": "string",
          "minLength": 1
        }
      }
    },

    "Item": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "MaterialType",
        "DataTopics"
      ],
      "properties": {
        "MaterialType": {
          "$ref": "https://imde.io/schema/azlon/1.0/codelists/materialType.json"
        },

        "DataTopics": {
          "$ref": "#/$defs/DataTopics"
        }
      }
    },

    "PackagingSystem": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "PackagingLevel",
        "DataTopics"
      ],
      "properties": {
        "PackagingLevel": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/PackagingLevelIdentifier"
          }
        },

        "DataTopics": {
          "$ref": "#/$defs/DataTopics"
        }
      }
    },

    "DataTopics": {
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "https://imde.io/schema/datatopics/registry.json"
      }
    },

    "BOM": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "Item"
      ],
      "properties": {
        "Item": {
          "$ref": "#/$defs/BOMRootItem"
        }
      }
    },

    "BOMRootItem": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "MaterialType"
      ],
      "properties": {
        "MaterialType": {
          "$ref": "https://imde.io/schema/azlon/1.0/codelists/materialType.json"
        },

        "ItemIdentifiers": {
          "$ref": "#/$defs/Identifiers"
        },

        "Items": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "Item"
          ],
          "properties": {
            "Item": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/$defs/BOMItem"
              }
            }
          }
        }
      }
    },

    "BOMItem": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "MaterialType",
        "Quantity",
        "QuantityUnits"
      ],
      "properties": {
        "MaterialType": {
          "$ref": "https://imde.io/schema/azlon/1.0/codelists/materialType.json"
        },

        "Quantity": {
          "type": "number"
        },

        "QuantityUnits": {
          "$ref": "#/$defs/QuantityUnits"
        },

        "ItemIdentifiers": {
          "$ref": "#/$defs/Identifiers"
        },

        "Items": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "Item"
          ],
          "properties": {
            "Item": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/$defs/BOMItem"
              }
            }
          }
        }
      }
    },

    "QuantityUnits": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "QuantityUnit"
      ],
      "properties": {
        "QuantityUnit": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/QuantityUnit"
          }
        }
      }
    },

    "QuantityUnit": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "Type",
        "Value"
      ],
      "properties": {
        "Type": {
          "$ref": "https://imde.io/schema/azlon/1.0/codelists/unitType.json"
        },

        "Value": {
          "type": "string",
          "minLength": 1
        }
      }
    },

    "Identifiers": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "Identifier"
      ],
      "properties": {
        "Identifier": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/Identifier"
          }
        }
      }
    },

    "Identifier": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "Type",
        "Value"
      ],
      "properties": {
        "Type": {
          "$ref": "https://imde.io/schema/azlon/1.0/codelists/identifierType.json"
        },

        "Value": {
          "type": "string",
          "minLength": 1
        }
      }
    },

    "PackagingLevelIdentifier": {
      "type": "object",
      "required": [ "CodeList", "Value" ],
      "properties": {
        "CodeList": {
          "type": "string"
        },
        "Value": {
          "type": "string"
        }
      },
      "if": {
        "properties": {
          "CodeList": {
            "const": "IMDE"
          }
        }
      },
      "then": {
        "properties": {
          "Value": {
            "$ref": "https://imde.io/schema/azlon/1.0/codelists/packagingLevel.json"
          }
        }
      }
    }
  }
}