<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://gateway.ixopay.com/Schema/V2/Result" targetNamespace="http://gateway.ixopay.com/Schema/V2/Result">
    <!-- ROOT ELEMENT -->
    <xs:element name="result" type="resultType">

    </xs:element>

    <!-- ROOT TYPE -->
    <xs:complexType name="resultType">
        <xs:sequence>
            <xs:element type="xs:boolean" name="success" minOccurs="1" maxOccurs="1" />
            <xs:element type="xs:string" name="referenceId" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="purchaseId" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="registrationId" minOccurs="0" maxOccurs="1" />
            <xs:element type="returnType" name="returnType" minOccurs="1" maxOccurs="1" />
            <xs:element type="xs:anyURI" name="redirectUrl" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="htmlContent" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="paymentDescriptor" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="paymentMethod" minOccurs="0" maxOccurs="1" />
            <xs:element type="returnDataType" name="returnData" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="scheduleId" minOccurs="0" maxOccurs="1" />
            <xs:element type="scheduleStatusType" name="scheduleStatus" minOccurs="0" maxOccurs="1" />
            <xs:element type="scheduleDateTime" name="scheduledAt" minOccurs="0" maxOccurs="1" />
            <xs:element type="customerProfileDataType" name="customerProfile" minOccurs="0" maxOccurs="1" />
            <xs:element type="riskCheckDataType" name="riskCheckData" minOccurs="0" maxOccurs="1" />
            <xs:element type="errorsType" name="errors" minOccurs="0" maxOccurs="1" />
            <xs:element type="extraDataType" name="extraData" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <!-- CUSTOM TYPES -->
    <xs:complexType name="extraDataType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute type="xs:string" name="key" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:simpleType name="countryType">
        <xs:restriction base="xs:string">
            <xs:pattern value="[A-Z][A-Z]" />
        </xs:restriction>
    </xs:simpleType>

   <xs:simpleType name="returnTypeValues">
       <xs:restriction base="xs:string">
           <xs:enumeration value="FINISHED" />
           <xs:enumeration value="REDIRECT" />
           <xs:enumeration value="HTML" />
           <xs:enumeration value="PENDING" />
           <xs:enumeration value="ERROR" />
       </xs:restriction>
   </xs:simpleType>
    <xs:complexType name="returnType">
        <xs:simpleContent>
            <xs:extension base="returnTypeValues">
                <xs:attribute name="redirectType" use="optional">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="iframe" />
                            <xs:enumeration value="fullpage" />
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="errorsType">
        <xs:sequence>
            <xs:element type="errorType" name="error" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="errorType">
        <xs:sequence>
            <xs:element type="xs:string" name="message" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:positiveInteger" name="code" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="adapterMessage" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="adapterCode" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="returnDataTypeEnum">
        <xs:restriction base="xs:string">
            <xs:enumeration value="creditcardData" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="scheduleStatusType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="ACTIVE" />
            <xs:enumeration value="PAUSED" />
            <xs:enumeration value="CANCELLED" />
            <xs:enumeration value="ERROR" />
            <xs:enumeration value="CREATE-PENDING" /> <!-- create process of schedule is not finished yet -->
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="scheduleDateTime">
        <xs:restriction base="xs:string">
            <xs:pattern value="\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [A-Z]{1,5}" /> <!-- YYYY-MM-DD HH:mm:ss T, eg. "2019-12-30 23:59:59 UTC" -->
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="customerProfileDataType">
        <xs:sequence>
            <xs:element type="xs:string" name="profileGuid" minOccurs="1" maxOccurs="1" />
            <xs:element type="xs:string" name="customerIdentification" minOccurs="1" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="returnDataType">
        <xs:choice>
            <xs:element type="creditcardDataType" name="creditcardData" />
            <xs:element type="phoneDataType" name="phoneData" />
            <xs:element type="ibanDataType" name="ibanData" />
        </xs:choice>
        <xs:attribute name="type" type="returnDataTypeEnum" use="required" />
    </xs:complexType>
    <xs:complexType name="creditcardDataType">
        <xs:sequence>
            <xs:element type="xs:string" name="type" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="firstName" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="lastName" minOccurs="0" maxOccurs="1" />
            <xs:element type="countryType" name="country" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="cardHolder" minOccurs="0" maxOccurs="1" />
            <xs:element name="expiryMonth" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:integer">
                        <xs:minInclusive value="1" />
                        <xs:maxInclusive value="12" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="expiryYear" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:integer">
                        <xs:totalDigits value="4" />
                        <xs:fractionDigits value="0" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="firstSixDigits" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:length value="6" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="lastFourDigits" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:length value="4" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="phoneDataType">
        <xs:sequence>
            <xs:element type="xs:string" name="phoneNumber" minOccurs="0" maxOccurs="1" />
            <xs:element type="countryType" name="country" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="operator" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ibanDataType">
        <xs:sequence>
            <xs:element type="xs:string" name="accountOwner" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="iban" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="bic" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="bankName" minOccurs="0" maxOccurs="1" />
            <xs:element type="countryType" name="country" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>
    <xs:simpleType name="riskCheckResultType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="APPROVED" />
            <xs:enumeration value="DECLINED" />
            <xs:enumeration value="REVIEW" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="threeDSecureRequiredType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="NONE" />
            <xs:enumeration value="OPTIONAL" />
            <xs:enumeration value="MANDATORY" />
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="riskCheckDataType">
        <xs:sequence>
            <xs:element type="riskCheckResultType" name="result" minOccurs="1" maxOccurs="1" />
            <xs:element type="xs:integer" name="riskScore" minOccurs="0" maxOccurs="1" />
            <xs:element type="threeDSecureRequiredType" name="threeDSecureRequired" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>

</xs:schema>