<?xml version="1.0" encoding="UTF-8"?>

<!-- XML Schema for Invoke indicator validation report  -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
		xmlns="http://www.invoke-software.com/2020/indicator-validation-report" 
		targetNamespace="http://www.invoke-software.com/2020/indicator-validation-report" 
		elementFormDefault="qualified" 
		attributeFormDefault="unqualified">
		
	<xs:simpleType name="severityType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="ERROR"/>
			<xs:enumeration value="WARNING"/>
			<xs:enumeration value="OK"/>
		</xs:restriction>
	</xs:simpleType>
	
	<!-- Type of the element that defines an assertion ref   -->
	<xs:complexType name="assertionRefType">
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="validated" type="xs:boolean"/>
		<xs:attribute name="message" type="xs:string"/>
		<xs:attribute name="isComplete" type="xs:boolean"/>
	</xs:complexType>
	
	<!-- Type of the element that contains the assertion refs -->
	<xs:complexType name="assertionRefListType">
	    <xs:sequence>
			<!-- Element that defines the assertion ref -->
			<xs:element name="assertionRef" type="assertionRefType" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
		<xs:attribute name="validated" type="xs:boolean"/>
	</xs:complexType>
	
	<!-- Type of the element that defines an explicit dimension -->
	<xs:complexType name="explicitDimensionType">
		<xs:simpleContent>
			<xs:extension base="xs:QName">
				<xs:attribute name="name" type="xs:QName" use="required"/>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
	
	<!-- Type of the element that defines a typed dimension -->
	<xs:complexType name="typedDimensionType">
	    <xs:sequence>
			<!-- Value of the dimension -->
			<xs:any processContents="lax" />
		</xs:sequence>
		<xs:attribute name="name" type="xs:QName"/>
	</xs:complexType>		
	
	<!-- Type of the element that contains the fact dimensions -->
	<xs:complexType name="dimensionListType">
	    <xs:sequence>
			<!-- Element that defines an explicit dimension -->
			<xs:element name="explicit" type="explicitDimensionType" minOccurs="0" maxOccurs="unbounded"/>
			<!-- Element that defines a typed dimension -->
			<xs:element name="typed" type="typedDimensionType" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	
	<!-- Type of the element that defines an indocator  -->
	<xs:complexType name="indicatorType">
	    <xs:sequence>
			<!-- Element that contains the fact dimensions --> 
			<xs:element name="dimensions" type="dimensionListType" minOccurs="0" maxOccurs="1"/>
			<!-- Element that contains the assertion refs -->
			<xs:element name="assertionRefs" type="assertionRefListType" minOccurs="0" maxOccurs="1"/>
		</xs:sequence>
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="concept" type="xs:QName"/>
		<xs:attribute name="type" type="xs:QName"/>
		<xs:attribute name="endDate" type="xs:string"/>
		<xs:attribute name="startDate" type="xs:string"/>
		<xs:attribute name="value" type="xs:string"/>
		<xs:attribute name="unit" type="xs:QName"/>
		<xs:attribute name="decimals" type="xs:integer"/>
	</xs:complexType>
	
	<!-- Type of the element that contains the indicators  -->
	<xs:complexType name="indicatorListType">
	    <xs:sequence>
			<!-- Element that defines an indocator -->
			<xs:element name="indicator" type="indicatorType" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
		
	<!-- Type of the element that defines an assertion   -->
	<xs:complexType name="assertionType">
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="description" type="xs:string"/>
		<xs:attribute name="expression" type="xs:string"/>
		<xs:attribute name="validated" type="xs:boolean"/>
		<xs:attribute name="severity" type="severityType"/>
		<xs:attribute name="evaluationCount" type="xs:integer"/>
		<xs:attribute name="evaluationTime" type="xs:decimal"/>
	</xs:complexType>
		
	<!-- Type of the element that contains the assertions  -->
	<xs:complexType name="assertionListType">
	    <xs:sequence>
			<!-- Element that defines an assertion -->
			<xs:element name="assertion" type="assertionType" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
		
	<!-- Type of the base element that contains the validation results  -->
	<xs:complexType name="indicatorReportType">
	    <xs:sequence>
			<!-- Element that contains the assertions -->
			<xs:element name="assertions" type="assertionListType" minOccurs="0" maxOccurs="1"/>
			<!-- Element that contains the indicators -->
			<xs:element name="indicators" type="indicatorListType"/>
		</xs:sequence>
	    <xs:attribute name="evaluationCount" type="xs:integer" use="required"/>
	    <xs:attribute name="evaluationTime" type="xs:decimal" use="required"/>	
	    <xs:attribute name="validated" type="xs:boolean" use="required"/>
		<xs:attribute name="hasWarning" type="xs:boolean"/>	
	</xs:complexType>
		
	<!-- Base element that contains the validation results -->
	<xs:element name="indicatorReport" type="indicatorReportType" nillable="false"/>

</xs:schema>