<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0.0">
    <!--=====================================================================-->
    <!--                        Schema Management                            -->
    <!--=====================================================================-->
    <!--                             IMPORTS                                 -->
    <!--                          DOCUMENTATION                              -->
    <xsd:annotation>
        <xsd:documentation xml:lang="en"/>
        <xsd:documentation>
            <name>Address Lookup Interface</name>
            <revision version="1.0.0">
                <date>2023-NOV-10</date>
            </revision>
        </xsd:documentation>
    </xsd:annotation>
    <!--                             INCLUDE                                 -->
    <!--                            REDEFINE                                 -->
    <!--=====================================================================-->
    <!--                    Model-Building Components                        -->
    <!--=====================================================================-->
    <!--                            NOTATIONS                                -->
    <!--                           SIMPLE TYPES                              -->
    <xsd:simpleType name="ModeSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:enumeration value="direct"/>
            <xsd:enumeration value="batch"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="BatchIdentifierSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="22"/>
            <xsd:maxLength value="150"/>
            <xsd:pattern value="[A-Z]{1,4}-[A-Z,0-9]{1,32}-[A-Z,0-9]{1,32}-([A-Z]{1,32}-){0,2}[0-9]{17}"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="IdentifierSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="1"/>
            <xsd:maxLength value="32"/>
            <xsd:pattern value="[0-9a-zA-Z]{1,32}"/>
        </xsd:restriction>
    </xsd:simpleType>
   
    <xsd:simpleType name="VersionSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:pattern value="[0-9].[0-9]"/>
        </xsd:restriction>
    </xsd:simpleType>
            
    <xsd:simpleType name="DateTimeSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="24"/>
            <xsd:maxLength value="24"/>
            <xsd:pattern value="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="MessageCountSimpleType">
        <xsd:restriction base="xsd:nonNegativeInteger">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="3000"/>
        </xsd:restriction>
    </xsd:simpleType>
            
    <xsd:simpleType name="DebtorReferenceSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="1"/>
            <xsd:maxLength value="35"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="TokenLength128SimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:maxLength value="128"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="TokenLength256SimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:maxLength value="256"/>
        </xsd:restriction>
    </xsd:simpleType>

            
   <xsd:simpleType name="TokenLength12SimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:maxLength value="10"/>
        </xsd:restriction>
    </xsd:simpleType>
 
    <xsd:simpleType name="EntranceCodeSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="1"/>
            <xsd:maxLength value="40"/>
            <xsd:pattern value="[0-9a-zA-Z]{1,40}"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="ErrorCodeSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:pattern value="[A-Z]{2}[0-9]{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="AddressLookupResultSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:enumeration value="FOUND"/>
            <xsd:enumeration value="NOT_FOUND"/>
            <xsd:enumeration value="BAD_FORMAT"/>
            <xsd:enumeration value="COUNTRY_CURRENTLY_NOT_SUPPORTED"/>
            <xsd:enumeration value="EXTERNAL_SERVICE_NOT_AVAILABLE"/>
         </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="AddressTypeSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:enumeration value="PRIVATE"/>
            <xsd:enumeration value="BUSINESS"/>
         </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="CountrySimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:pattern value="[A-Z]{2,2}"/>
        </xsd:restriction>
    </xsd:simpleType>

    <!--                          COMPLEX TYPES                              -->
 
    <!--                          ROOT ELEMENT TYPE                          -->
    <xsd:complexType name="AddressLookupInterfaceType">
        <xsd:choice maxOccurs="unbounded" minOccurs="0">
            <xsd:element name="AddressLookupTransactionRequest"  type="AddressLookupTransactionRequestType" maxOccurs="1"/>
            <xsd:element name="AddressLookupTransactionResponse" type="AddressLookupTransactionResponseType" maxOccurs="1"/>
            <xsd:element name="AddressLookupErrorResponse"       type="AddressLookupErrorResponseType" minOccurs="0" maxOccurs="1"/>
        </xsd:choice>
        <xsd:attributeGroup ref="HeaderAttributes"/>
    </xsd:complexType>
    
    <!--                      COMPLEX TYPES DESCRIBING MAIN DOCUMENTS TYPES  -->
     <xsd:complexType name="AddressLookupTransactionRequestType">
        <xsd:all>
            <xsd:element name="AddressRequest"  type="AddressRequestType"/>
 			<xsd:element name="DebtorReference" type="DebtorReferenceSimpleType" minOccurs="0"/>
        </xsd:all>
        <xsd:attributeGroup ref="RequestAttributes"/>
    </xsd:complexType>
    
    <xsd:complexType name="AddressLookupTransactionResponseType">
       <xsd:sequence>
        	<xsd:choice maxOccurs="1" minOccurs="1">
        		<xsd:sequence>
	        		<xsd:element name="AddressLookupResult" type="AddressLookupResultSimpleType"/>
            		<xsd:element name="Address"             type="AddressType"/>
        		</xsd:sequence>
 				<xsd:element name="Error"                   type="ErrorComplexType" maxOccurs="1"/>
        	</xsd:choice>
 			<xsd:element name="DebtorReference"             type="DebtorReferenceSimpleType" minOccurs="0"/>
 		</xsd:sequence>
        <xsd:attributeGroup ref="RequestAttributes"/>
    </xsd:complexType>
    
        
    <xsd:complexType name="AddressLookupErrorResponseType">
        <xsd:sequence>
            <xsd:element name="Error" type="ErrorComplexType" maxOccurs="1"/>
        </xsd:sequence>
    </xsd:complexType>
    
             
    <!--                      OTHER COMPLEX TYPES                            -->    
    <xsd:complexType name="ErrorComplexType">
        <xsd:sequence>
            <xsd:element name="ErrorCode"    type="ErrorCodeSimpleType"/>
            <xsd:element name="ErrorMessage" type="TokenLength128SimpleType"/>
            <xsd:element name="ErrorDetail"  type="TokenLength256SimpleType" minOccurs="0"/>
            <xsd:element name="Object"       type="TokenLength256SimpleType" minOccurs="0"/>
        </xsd:sequence>
    </xsd:complexType>
    
    
    <!-- GeoLocation -->
    <xsd:complexType name="GeoLocationType">
        <xsd:all>
            <xsd:element name="Latitude"  type="xsd:decimal"/>
            <xsd:element name="Longitude" type="xsd:decimal"/>
		</xsd:all>
    </xsd:complexType>

    
    <!-- AddressRequest -->
    <xsd:complexType name="AddressRequestType">
        <xsd:all>
            <xsd:element name="ZipCode"           type="TokenLength12SimpleType"/>
            <xsd:element name="HouseNumber"       type="xsd:nonNegativeInteger"/>
			<xsd:element name="HouseNumberSuffix" type="TokenLength12SimpleType" minOccurs="0"/>
			<xsd:element name="Country"           type="CountrySimpleType" default="NL" minOccurs="0"/>
		</xsd:all>
    </xsd:complexType>
    
    <!-- AddressResponse -->
    <xsd:complexType name="AddressResponseType">
        <xsd:all>
	        <xsd:element name="StreetName"  type="TokenLength128SimpleType" minOccurs="0"/>
            <xsd:element name="Place"       type="TokenLength128SimpleType" minOccurs="0"/>
            <xsd:element name="Province"    type="TokenLength128SimpleType" minOccurs="0"/>
            <xsd:element name="Country"     type="CountrySimpleType" minOccurs="0"/>
            <xsd:element name="GeoLocation" type="GeoLocationType" minOccurs="0"/>
            <xsd:element name="AddressType" type="AddressTypeSimpleType" minOccurs="0"/>
 		</xsd:all>
    </xsd:complexType>
    
    
       <!-- Address -->
    <xsd:complexType name="AddressType">
        <xsd:all>
            <xsd:element name="AddressRequest"  type="AddressRequestType"/>
            <xsd:element name="AddressResponse" type="AddressResponseType" minOccurs="0"/>
		</xsd:all>
    </xsd:complexType>

      
    <!--                        ATTRIBUTE GROUPS                             -->
    <xsd:attributeGroup name="HeaderAttributes">
        <xsd:attribute name="mode"           type="ModeSimpleType" use="required"/>
        <xsd:attribute name="batchID"        type="BatchIdentifierSimpleType"/>
        <xsd:attribute name="senderID"       type="IdentifierSimpleType" use="required"/>
        <xsd:attribute name="version"        type="VersionSimpleType" default="1.0"/>
        <xsd:attribute name="createDateTime" type="DateTimeSimpleType" use="required"/>
        <xsd:attribute name="messageCount"   type="MessageCountSimpleType" use="required"/>
        <xsd:attribute name="type" use="required">
            <xsd:simpleType>
                <xsd:restriction base="xsd:token">
                    <xsd:enumeration value="TransactionRequest"/>
                    <xsd:enumeration value="TransactionResponse"/>
                    <xsd:enumeration value="ErrorResponse"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
    </xsd:attributeGroup>
    
    <xsd:attributeGroup name="RequestAttributes">
    	<xsd:attribute name="entranceCode" type="EntranceCodeSimpleType"/>
    </xsd:attributeGroup>
    
    <!--                             ELEMENTS                                -->
    <xsd:element name="AddressLookupInterface" type="AddressLookupInterfaceType"/>
    
</xsd:schema>