<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="urn:cablelabs:safi:xsd:sms:3.0"
    xmlns:common="urn:cablelabs:safi:xsd:com:3.0"
    targetNamespace="urn:cablelabs:safi:xsd:sms:3.0"
    elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
    <xs:annotation>
        <xs:documentation>
            <b>Copyright (C) 2008-2011, Cable Television Laboratories, Inc.</b>
            <b>SaFI Service Measurement Summary Interface, XML Schema, Release Version 3.0.0</b>
            <b>Controlled by specification: OC-SP-SaFI-SMSv3.0-xxxxxx</b>
        </xs:documentation>
    </xs:annotation>   
    <xs:import namespace="urn:cablelabs:safi:xsd:com:3.0" schemaLocation="OC-SaFI-COM-3.0.0.xsd"/>
    
    <!-- Service Measurement Message containers -->
    <xs:element name="ServiceMeasurementMessage" type="ServiceMeasurementMessageType"/>
    <xs:element name="AcknowledgementMessage" type="common:AcknowledgementMessageType"/>
    
    <!-- Message Type Definitions -->

    <xs:complexType name="ServiceMeasurementType">
        <xs:sequence>
            <xs:element name="SMTimeRange" type="common:TimeRangeType"/>
            <xs:element name="GeoCode" type="common:GeographicCodeType"/>
            <xs:element name="Measurement" type="MeasurementType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="ServiceMeasurementMessageType">
        <xs:sequence>
            <xs:group ref="ServiceMeasurementMessageHeaderGroup"/>
            <xs:element name="ServiceMeasurement" type="ServiceMeasurementType" minOccurs="1"
                maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <!-- Measurement Types Definitions -->

    <xs:complexType name="MeasurementType" abstract="true">
        <xs:sequence>
            <xs:annotation>
                <xs:documentation>Type placeholder for extension</xs:documentation>
            </xs:annotation>
        </xs:sequence>
        <xs:attribute name="process" type="MessageProcessingType" use="required"/>
        <xs:attribute name="reporting" type="MessageReportingStatusType" use="required"/>
    </xs:complexType>

    <xs:complexType name="InteractiveResponseType">
        <xs:complexContent>
            <xs:extension base="MeasurementType">
                <xs:sequence>
                    <xs:element name="InteractivePackage" type="InteractivePackageType"
                        minOccurs="1" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
 
    <xs:complexType name="ResultType">
        <xs:simpleContent>
            <xs:extension base="xs:integer">
                <xs:attribute name="Parameters" type="common:ParametersType" use="required"/>
                <xs:attribute name="TotalInterval" type="xs:duration" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <!-- Complex Types providing proper "packaging" to support repeating groups of elements -->
    <xs:complexType name="InteractivePackageType">
        <xs:sequence>
            <xs:element name="Result" type="ResultType" minOccurs="1" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="PEID" type="common:PeidType" use="required"/>
        <xs:attribute name="EPSID" type="common:EpsidType" use="required"/>
        <xs:attribute name="EventID" type="common:EventIDType" use="optional"/>
        <xs:attributeGroup ref="common:ApplicationDefinitionAttributeGroup"/>
    </xs:complexType>

    <!-- Simple Type Definitions -->
    <xs:simpleType name="MessageProcessingType">
        <xs:annotation>
            <xs:documentation>
            <p>Defines how this message should be processed in relation to others.  Messages flagged with the "additive" attribute should be added to other recieved reports for same time period and identifiers. While messages with the "overwrite" attribute should replace records for the same time period and identifiers</p>
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="additive"/>
            <xs:enumeration value="overwrite"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="MessageReportingStatusType">
        <xs:annotation>
            <xs:documentation>
                <p>Defines if this message contains final/complete data or if it is a partial/incremental update.</p>
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="final"/>
            <xs:enumeration value="partial"/>
        </xs:restriction>
    </xs:simpleType>

    <!-- Group Definitions -->
    <xs:group name="ServiceMeasurementMessageHeaderGroup">
        <xs:sequence>
            <xs:element name="Version" type="common:VersionType"/>
            <xs:element name="MessageTime" type="xs:dateTime"/>
            <xs:element name="DerivativeId" type="common:DerivativeIdType" minOccurs="0"/>
        </xs:sequence>
    </xs:group>

</xs:schema>
