<?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/1.1"
    xmlns:common="http://www.cablelabs.com/namespaces/safi/xsd/com/1.1"
    targetNamespace="http://www.cablelabs.com/namespaces/safi/xsd/sms/1.1"
    elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">

    <xs:import namespace="http://www.cablelabs.com/namespaces/safi/xsd/com/1.1"
        schemaLocation="http://www.cablelabs.com/namespaces/safi/xsd/com/v1.1/CL-SaFI-COM-1.1.0.xsd"/>
    
    <xs:annotation>
        <xs:documentation>
            <b>Copyright (C) 2008-2010, Cable Television Laboratories, Inc.</b>
            <b>SaFI Service Measurement Summary Interface XML Schema Version 
                1.1.-1</b>
        </xs:documentation>
    </xs:annotation>
    
    <!-- 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">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).</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"> 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</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">An integer count for all placements within content of an
                Asset for a designated time period.</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>Represents content which was altered by placement.</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>Represents how the avail was filled. Specifically was content replaced
                or inserted.</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>Addressable attributes.</xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string"/>
    </xs:simpleType>

    <xs:simpleType name="ContentType">
        <xs:annotation>
            <xs:documentation>Represents type of content being identified.</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>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</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>Defines if this message contains final/complete data or if it is a partial/incremental update.</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>
