<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
  attributeFormDefault="unqualified" elementFormDefault="qualified"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  
  <xsd:include schemaLocation="CommonTypes.xsd"/>

  <!-- Request Types:
       The following types represent the different types of requests
       accepted by the XML Interface.
  -->
  
  <xsd:complexType name="SendMessagesRequestType">
    <xsd:sequence>
      <xsd:element name="authentication" type="AuthenticationType"/>
      <xsd:element name="requestBody" type="SendMessagesBodyType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="CheckUserRequestType">
    <xsd:sequence>
      <xsd:element name="authentication" type="AuthenticationType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="CheckRepliesRequestType">
    <xsd:sequence>
      <xsd:element name="authentication" type="AuthenticationType"/>
      <xsd:element name="requestBody" type="CheckRepliesBodyType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="CheckReportsRequestType">
    <xsd:sequence>
      <xsd:element name="authentication" type="AuthenticationType"/>
      <xsd:element name="requestBody" type="CheckReportsBodyType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="ConfirmRepliesRequestType">
    <xsd:sequence>
      <xsd:element name="authentication" type="AuthenticationType"/>
      <xsd:element name="requestBody" type="ConfirmRepliesBodyType"/>
    </xsd:sequence>
  </xsd:complexType>
  
  <xsd:complexType name="ConfirmReportsRequestType">
    <xsd:sequence>
      <xsd:element name="authentication" type="AuthenticationType"/>
      <xsd:element name="requestBody" type="ConfirmReportsBodyType"/>
    </xsd:sequence>
  </xsd:complexType>
  
  <xsd:complexType name="DeleteScheduledMessagesRequestType">
    <xsd:sequence>
      <xsd:element name="authentication" type="AuthenticationType"/>
      <xsd:element name="requestBody" type="DeleteScheduledMessagesBodyType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="BlockNumbersRequestType">
    <xsd:sequence>
      <xsd:element name="authentication" type="AuthenticationType"/>
      <xsd:element name="requestBody" type="BlockNumbersBodyType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="UnblockNumbersRequestType">
    <xsd:sequence>
      <xsd:element name="authentication" type="AuthenticationType"/>
      <xsd:element name="requestBody" type="UnblockNumbersBodyType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="GetBlockedNumbersRequestType">
    <xsd:sequence>
      <xsd:element name="authentication" type="AuthenticationType"/>
      <xsd:element name="requestBody" type="GetBlockedNumbersBodyType"/>
    </xsd:sequence>
  </xsd:complexType>

  <!-- Types used by the Request Types:
       The following types define the types of the elements that
       the Request Types are composed of.
  -->

  <xsd:complexType name="AuthenticationType">
    <xsd:sequence>
      <xsd:element name="userId" type="xsd:string"/>
      <xsd:element name="password" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="SendMessagesBodyType">
    <xsd:sequence>
      <xsd:element name="messages" type="MessageListType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="CheckRepliesBodyType">
    <xsd:sequence>
      <xsd:element name="maximumReplies" type="xsd:unsignedInt" minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="CheckReportsBodyType">
    <xsd:sequence>
      <xsd:element name="maximumReports" type="xsd:unsignedInt" minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="ConfirmRepliesBodyType">
    <xsd:sequence>
      <xsd:element name="replies" type="ConfirmReplyListType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="ConfirmReportsBodyType">
    <xsd:sequence>
      <xsd:element name="reports" type="ConfirmReportListType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="MessageListType">
    <xsd:sequence>
      <xsd:element name="message" type="MessageType" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="sendMode" type="MessageSendModeType" use="optional" default="normal"/>
  </xsd:complexType>

  <xsd:simpleType name="MessageSendVersionType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="1"/>
      <xsd:enumeration value="2"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="MessageSendModeType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="dropAll"/>
      <xsd:enumeration value="dropAllWithErrors"/>
      <xsd:enumeration value="dropAllWithSuccess"/>
      <xsd:enumeration value="normal"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:complexType name="CheckRepliesType">
    <xsd:sequence>
      <xsd:element name="maximumReplies" type="xsd:unsignedInt" minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="CheckReportListType">
    <xsd:sequence>
      <xsd:element name="maximumReports" type="xsd:unsignedInt" minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>
  
  <xsd:complexType name="ConfirmReplyListType">
    <xsd:sequence>
      <xsd:element name="reply" type="ConfirmItemType" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
  
  <xsd:complexType name="ConfirmReportListType">
    <xsd:sequence>
      <xsd:element name="report" type="ConfirmItemType" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="DeleteScheduledMessagesBodyType">
    <xsd:sequence>
      <xsd:element name="messages" type="MessageIdListType"/>
    </xsd:sequence>
  </xsd:complexType>
  
  <xsd:complexType name="MessageIdListType">
    <xsd:sequence>
      <xsd:element name="message" type="MessageIdType" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="MessageIdType">
    <xsd:sequence/>
    <xsd:attribute name="messageId" type="xsd:unsignedInt" use="required"/>
  </xsd:complexType>

  <xsd:complexType name="MessageTagType">
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:attribute name="name" type="xsd:string" use="required"/>    
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>

  <xsd:complexType name="MessageTagListType">
    <xsd:sequence>
      <xsd:element name="tag" type="MessageTagType" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="MessageType">
    <xsd:all>
      <xsd:element name="origin" type="xsd:string" minOccurs="0"/>
      <xsd:element name="recipients" type="RecipientsType"/>
      <xsd:element name="content" type="xsd:string"/>
      <xsd:element name="scheduled" type="xsd:dateTime" minOccurs="0"/>
      <xsd:element name="deliveryReport" type="xsd:boolean" minOccurs="0" default="false"/>
      <xsd:element name="validityPeriod" type="xsd:unsignedByte" minOccurs="0" default="169"/>
      <xsd:element name="tags" type="MessageTagListType" minOccurs="0"/>
    </xsd:all>
    <xsd:attribute name="format" type="MessageFormatType" use="optional" default="SMS"/>
    <xsd:attribute name="sequenceNumber" type="xsd:unsignedInt" use="optional" default="0"/>
    <xsd:anyAttribute processContents="lax"/>
  </xsd:complexType>

  <xsd:complexType name="ConfirmItemType">
    <xsd:sequence/>
    <xsd:attribute name="receiptId" type="xsd:unsignedInt" use="required"/>
  </xsd:complexType>

  <xsd:complexType name="BlockNumbersBodyType">
    <xsd:sequence>
      <xsd:element name="recipients" type="RecipientsType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="UnblockNumbersBodyType">
    <xsd:sequence>
      <xsd:element name="recipients" type="RecipientsType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="GetBlockedNumbersBodyType">
    <xsd:sequence>
      <xsd:element name="maximumRecipients" type="xsd:unsignedInt" minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>

</xsd:schema>
