<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.cablelabs.com/namespaces/safi/xsd/sms/2.0"
    xmlns:common="http://www.cablelabs.com/namespaces/safi/xsd/com/2.0"
    targetNamespace="http://www.cablelabs.com/namespaces/safi/xsd/sms/2.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 2.0.0</b>
            <b>Controlled by specification: OC-SP-SaFI-SMSv2.0-110131</b>
        </xs:documentation>
    </xs:annotation>   
    <xs:import namespace="http://www.cablelabs.com/namespaces/safi/xsd/com/2.0"
        schemaLocation="http://www.cablelabs.com/namespaces/safi/xsd/com/v2.0/OC-SaFI-COM-2.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="AdPlacementSummaryType">
        <xs:complexContent>
            <xs:extension base="MeasurementType">
                <xs:sequence>
                    <xs:element name="AdPlacementSummaryPackage"
                        type="AdPlacementSummaryPackageType" minOccurs="1" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="AdPlacementSessionDataType">
        <xs:complexContent>
            <xs:extension base="MeasurementType">
                <xs:sequence>
                    <xs:element name="AdPlacementSessionDataPackage"
                        type="AdPlacementSessionDataPackageType" minOccurs="1" maxOccurs="unbounded"
                    />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>


    <!-- General Complex Type Definitions -->
    <xs:complexType name="EventType">
        <xs:sequence>
            <xs:element name="PlacementCount" type="PlacementCountType" minOccurs="1" maxOccurs="1"/>
            <xs:element name="PlacementContext" type="PlacementContentType" minOccurs="1"
                maxOccurs="1"/>
        </xs:sequence>
        <xs:attribute name="EventID" type="common:EventIDType" use="optional"/>
    </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>

    <xs:complexType name="PlacementType">
        <xs:sequence>
            <xs:element name="Ad" type="ContentPackageType" minOccurs="1" maxOccurs="1"/>
            <xs:element name="PlacementTime" type="common:TimeRangeType" minOccurs="1" maxOccurs="1"/>
            <xs:element name="PlacementAction" type="PlacementActionType" minOccurs="1"
                maxOccurs="1"/>
            <xs:element name="TrackingId" type="common:TrackingType" minOccurs="1" maxOccurs="1"/>
            <xs:element name="SegmentationElements" type="SegmentationElementsType" minOccurs="0"
                maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="EventID" type="common:EventIDType" use="optional"/>
    </xs:complexType>

    <!-- Complex Types providing proper "packaging" to support repeating groups of elements -->
    <xs:complexType name="ContentPackageType">
        <xs:sequence>
            <xs:element name="ProviderId" type="ProviderIdType"/>
            <xs:element name="AssetId" type="AssetIdType"/>
        </xs:sequence>
        <xs:attribute name="type" type="ContentType"/>
    </xs:complexType>

    <xs:complexType name="ContentPackageSummaryType">
        <xs:complexContent>
            <xs:extension base="ContentPackageType">
                <xs:sequence>
                    <xs:element name="Event" type="EventType" minOccurs="1" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="ContentPackageSessionDataType">
        <xs:complexContent>
            <xs:extension base="ContentPackageType">
                <xs:sequence>
                    <xs:element name="SMSessionDataTime" type="common:TimeRangeType"/>
                    <xs:element name="Placement" type="PlacementType" minOccurs="1"
                        maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="AdPlacementSummaryPackageType">
        <xs:sequence>
            <xs:element name="ContentPackageSummary" type="ContentPackageSummaryType" 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:complexType>

    <xs:complexType name="AdPlacementSessionDataPackageType">
        <xs:sequence>
            <xs:element name="ContentPackageSessionData" type="ContentPackageSessionDataType"
                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:complexType>

    <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="ProviderIdType">
        <xs:annotation>
            <xs:documentation xml:lang="en">
                <P>A unique identifier for the provider of the Asset. The providerID MUST be set to a registered Internet domain name restricted to at most 20 lower-case characters and belonging to the provider. For example a valid providerID for CableLabs is "cablelabs-films.com" (19 chars).</P>
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="20"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="AssetIdType">
        <xs:annotation>
            <xs:documentation xml:lang="en">
                <P>An identifier for the asset that is unique within a provider's assetID space. The unique global identifier of an asset is the combination of its providerID and assetID</P>                
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:length value="20"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="PlacementCountType">
        <xs:annotation>
            <xs:documentation xml:lang="en">
                <p>An integer count for all placements within content of an Asset for a designated time period.</p></xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:int">
            <xs:minInclusive value="0"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="PlacementContentType">
        <xs:annotation>
            <xs:documentation>
                <p>Represents content which was altered by placement.</p>
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="vod"/>
            <xs:enumeration value="linear"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="PlacementActionType">
        <xs:annotation>
            <xs:documentation>
                <p>Represents how a placement opportunity (or 'avail') was filled. Specifically was content replaced or inserted.</p></xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="replaced"/>
            <xs:enumeration value="inserted"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="SegmentationElementsType">
        <xs:annotation>
            <xs:documentation>
                <p>Addressable attributes.</p>
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string"/>
    </xs:simpleType>

    <xs:simpleType name="ContentType">
        <xs:annotation>
            <xs:documentation>
                <p>Represents type of content being identified.</p>
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="target"/>
            <xs:enumeration value="enhancement"/>
        </xs:restriction>
    </xs:simpleType>

    <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>
