<?xml version="1.0" encoding="UTF-8"?>

<xs:schema
  version         = "1.0"
  xmlns:xs        = "http://www.w3.org/2001/XMLSchema"
  targetNamespace = "http://www.nrao.edu/namespaces/sss"
  xmlns:sss       = "http://www.nrao.edu/namespaces/sss"
  elementFormDefault = "qualified">
  
  <xs:include schemaLocation="../../util/1.38-DEV/commons.xsd"/>
  <xs:include schemaLocation="constraint.xsd"/>
  <xs:include schemaLocation="priority.xsd"/>
  <xs:include schemaLocation="resource.xsd"/>
  <xs:include schemaLocation="scan.xsd"/>
      
  <!-- ================================================== -->
  <!-- ||||||||||||||||  ELEMENTS  |||||||||||||||||||||| -->
  <!-- ================================================== -->
      
  <xs:element name="project">
    <xs:complexType>
      <xs:sequence>
        <xs:group    ref="sss:userTrackable"/>
        <xs:element name="principalInvestigator"     type="sss:projectAuthor"/>
        <xs:element name="contactAuthor"             type="sss:projectAuthor"     minOccurs="0"/>
        <xs:element name="coauthors"                 type="sss:authorList"        minOccurs="0"/>
        <xs:element name="userPriorities"            type="sss:userPriorityList"  minOccurs="0"/>
        <xs:element name="refereeMedian"             type="xs:double"                        minOccurs="0"/>
        <xs:element name="observationPriorityValues" type="sss:observationPriorityValueList" minOccurs="0"/>
        <xs:element name="userDefinedValues"         type="sss:userDefinedValueList"         minOccurs="0"/>
        <xs:element name="comments"                  type="xs:string"                        minOccurs="0"/>
        <xs:element name="programBlocks"             type="sss:programBlockList"/>
      </xs:sequence>
      <xs:attribute name="id"           type="xs:long"           use="required"/>
      <xs:attribute name="projectCode"  type="xs:string"         use="required"/>
      <xs:attribute name="test"         type="xs:boolean"        use="required"/>
      <xs:attribute name="telescope"    type="sss:telescopeType" use="required"/>
      <xs:attribute name="title"        type="xs:string"         use="required"/>
      <xs:attribute name="proposalCode" type="xs:string"         use="required"/>
      <xs:attribute name="projectType"  type="sss:projectType"   use="required"/>
    </xs:complexType>
  </xs:element>
      
  <!-- These are here mainly for testing. -->
  <xs:element name="programBlock"     type="sss:programBlock"/>
  <xs:element name="schedulingBlock"  type="sss:schedulingBlock"/>
  <xs:element name="manualSchedBlock" type="sss:manualSchedBlock"/>
  <xs:element name="executionBlock"   type="sss:executionBlock"/>
      
  <!-- ================================================== -->
  <!-- ||||||||||||||||  COMPLEX TYPES  ||||||||||||||||| -->
  <!-- ================================================== -->
          
  <xs:complexType name="programBlock">
    <xs:sequence>
      <xs:group    ref="sss:userTrackable"/>
      <xs:element name="committeeRanking"          type="xs:int"                           minOccurs="0"/>
      <xs:element name="observationPriorityValues" type="sss:observationPriorityValueList" minOccurs="0"/>
      <xs:element name="timeAllocated"             type="sss:timeDuration"                 minOccurs="0"/>
      <xs:element name="acceptableConfigurations">
        <xs:simpleType>
          <xs:list itemType="sss:telescopeConfiguration"/>
        </xs:simpleType>
      </xs:element>
      <xs:element name="userDefinedValues"         type="sss:userDefinedValueList"         minOccurs="0"/>
      <xs:element name="comments"                  type="xs:string"                        minOccurs="0"/>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="prerequisite" type="xs:IDREF"/>
      </xs:sequence>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="corequisite" type="xs:IDREF"/>
      </xs:sequence>
      <xs:element name="schedulingBlocks" type="sss:schedulingBlockList"/>
      <xs:element name="conditionalSbExpression" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="id"            type="xs:long"         use="required"/>
    <xs:attribute name="xmlId"         type="xs:ID"           use="required"/>
    <xs:attribute name="name"          type="sss:nameString"  use="required"/>
    <xs:attribute name="forceComplete" type="xs:boolean"      use="optional" default="false"/>
    
  </xs:complexType>
          
  <xs:group name="schedBlockBase">
    <xs:sequence>
      <xs:group                                       ref="sss:userTrackable"/>
      <xs:element name="submitterId"                 type="xs:long"                    minOccurs="0"/>
      <xs:element name="submittedOn"                 type="xs:dateTime"                minOccurs="0"/>
      <xs:element name="approverId"                  type="xs:long"                    minOccurs="0"/>
      <xs:element name="approvedOn"                  type="xs:dateTime"                minOccurs="0"/>
      <xs:element name="blesserId"                   type="xs:long"                    minOccurs="0"/>
      <xs:element name="blessedOn"                   type="xs:dateTime"                minOccurs="0"/>
      <xs:element name="fixedStartTime"              type="xs:dateTime"                minOccurs="0"/>
      <xs:element name="alterationStatus"            type="sss:alterationStatus"/>
      <xs:element name="authorizedCount"             type="xs:int"/>
      <xs:element name="completedCount"              type="xs:int"/>
      <xs:element name="abortedCount"                type="xs:int"/>
      <xs:element name="minDaysRepeat"               type="xs:int" minOccurs="0"/>
      <xs:element name="minDaysRepeatUT"             type="xs:boolean" minOccurs="0"/>
      <xs:element name="minDaysFromLstRangeStart"    type="xs:boolean" minOccurs="0"/>
      <xs:element name="preferredDateRange"          type="sss:timeInterval"/>
      <xs:element name="lstStartRanges"              type="sss:lstStartRangeList"                  minOccurs="0"/>
      <xs:element name="monitoringInterval"          type="sss:timeDuration"                       minOccurs="0"/>
      <xs:element name="serviceCalibrations"         type="sss:serviceCalibrationList"             minOccurs="0"/>
      <xs:element name="environmentalConstraints"    type="sss:environmentalSchedulingConstraints" minOccurs="0"/>
      <xs:element name="observationPriorityValues"   type="sss:observationPriorityValueList"       minOccurs="0"/>
      <xs:element name="userDefinedValues"           type="sss:userDefinedValueList"               minOccurs="0"/>
      <xs:element name="comments"                    type="xs:string"                              minOccurs="0"/>
      <xs:element name="schedulingBlockStatus"       type="xs:string"                              minOccurs="0"/>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="prerequisite" type="xs:IDREF"/>
      </xs:sequence>
      <xs:element name="parentBlock"     type="xs:IDREF"               minOccurs="0"/>
      <xs:element name="executionBlocks" type="sss:executionBlockList" minOccurs="0"/>
      <xs:element name="telcalRefAnts"                    type="xs:string"/>
      <xs:element name="lstFinderLowElevation"                    type="sss:angle"/>
      <xs:element name="lstFinderHighElevation"                    type="sss:angle"/>
      <xs:element name="commentsToOperator"               type="xs:string"                  minOccurs="0"/>
    </xs:sequence>
  </xs:group>
          
  <xs:attributeGroup name="schedBlockAttrBase">
    <xs:attribute name="id"               type="xs:long"              use="required"/>
    <xs:attribute name="xmlId"            type="xs:ID"                use="required"/>
    <xs:attribute name="name"             type="sss:nameString"       use="required"/>
    <xs:attribute name="type"             type="sss:schedulingType"   use="required"/>
    <xs:attribute name="schedulingStatus" type="sss:schedulingStatus" use="required"/>
  </xs:attributeGroup>
  
  <xs:complexType name="schedulingBlock">
    <xs:sequence>
      <xs:group    ref="sss:schedBlockBase"/>
      <xs:element name="assumedStart"                     type="xs:dateTime"                minOccurs="0"/>
      <xs:element name="assumedTelescopePointing"         type="sss:evlaPointingPosition"   minOccurs="0"/>
      <xs:element name="antennaShadowThreshold"           type="xs:double"                  minOccurs="0"  default="0.0"/>
      <xs:element name="antennaShadowConfigurationChoice" type="sss:telescopeConfiguration" minOccurs="0"/>
      <xs:element name="scanBoundaryDopplerTracking"      type="xs:boolean"                 minOccurs="0"  default="false"/>
      <xs:element name="sources"                          type="sss:sourceList"/>
      <xs:element name="resources"                        type="sss:resourceList"/>
      <xs:element name="scanSequence"                     type="sss:scanLoop"/> 
    </xs:sequence>
    <xs:attributeGroup ref="sss:schedBlockAttrBase"/>
  </xs:complexType>
  
  <xs:complexType name="manualSchedBlock">
    <xs:sequence>
      <xs:group ref="sss:schedBlockBase"/>
    </xs:sequence>
    <xs:attributeGroup ref="sss:schedBlockAttrBase"/>
    <xs:attribute name="scriptLocation" type="xs:anyURI" use="required"/> 
  </xs:complexType>
            
  <xs:complexType name="serviceCalibration">
    <xs:all>
      <xs:element name="type"                type="sss:scanIntent"/>
      <xs:element name="timing"              type="sss:serviceCalibrationTiming"/>
      <xs:element name="allowableSeparation" type="sss:timeDuration"/>
    </xs:all>
  </xs:complexType>
            
  <xs:complexType name="environmentalSchedulingConstraints">
    <xs:all>
      <xs:element name="maxWindSpeedMetersPerSec" type="xs:double"  minOccurs="0"/>
      <xs:element name="maxApiDegrees"            type="xs:double"  minOccurs="0"/>
      <xs:element name="maxIonosphereDegrees"     type="xs:double"  minOccurs="0"/>
      <xs:element name="minSolarSepDegrees"       type="xs:double"  minOccurs="0"/>
      <xs:element name="minElevationDegrees"      type="xs:double"  minOccurs="0"/>
      <xs:element name="maxAllowableOpacity"      type="xs:double"  minOccurs="0"/>
      <xs:element name="avoidSunrise"             type="xs:boolean" minOccurs="0"/>
      <xs:element name="avoidSunset"              type="xs:boolean" minOccurs="0"/>
    </xs:all>
  </xs:complexType>
          
  <xs:complexType name="executionBlock">
    <xs:all>
      <xs:element name="comments"                   type="xs:string"                      minOccurs="0"/>
      <xs:element name="scriptExecutionsString"            type="sss:executionScriptList" minOccurs="0"/>
      <xs:element name="correlatorInstructionsList" type="sss:correlatorInstructionsList" minOccurs="0"/>
      <xs:element name="initialApi"                 type="sss:angle"                      minOccurs="0"/>
      <xs:element name="initialWindSpeed"           type="sss:linearVelocity"             minOccurs="0"/>
      <xs:element name="observationPriorities"      type="sss:observationPriorityList"    minOccurs="0"/>
      <xs:element name="userDefinedValues"          type="sss:userDefinedValueList"       minOccurs="0"/>
    </xs:all>      
    <xs:attribute name="id"                         type="xs:long"             use="required"/>
    <xs:attribute name="xmlId"                      type="xs:ID"               use="required"/>
    <xs:attribute name="startTime"                  type="xs:dateTime"         use="optional"/>
    <xs:attribute name="endTime"                    type="xs:dateTime"         use="optional"/>
    <xs:attribute name="executionStatus"            type="sss:executionStatus" use="required"/>
    <xs:attribute name="executionStatusChangeDate"  type="xs:dateTime"         use="required"/>
    <xs:attribute name="successfulIteration"        type="xs:int"              use="required"/>
    <xs:attribute name="reasonForFailure"           type="xs:string"           use="optional"  default="n/a"/>
    <xs:attribute name="antennaDownHours"           type="xs:double"           use="optional"  default="0.0"/>
  </xs:complexType>
                  
  <xs:complexType name="projectAuthor">
    <xs:attribute name="id"                type="xs:long"    use="required"/>
    <xs:attribute name="globalId"          type="xs:long"    use="required"/>
    <xs:attribute name="presentOnProposal" type="xs:boolean" use="optional"/>
    <xs:attribute name="receivesEmail"     type="xs:boolean" use="optional"/>
  </xs:complexType>
                                             
  <xs:complexType name="observationPriority">
    <xs:attribute name="type"   type="sss:observationPriorityType" use="required"/>
    <xs:attribute name="value"  type="xs:double"                   use="required"/>
    <xs:attribute name="weight" type="xs:double"                   use="required"/>
  </xs:complexType>
                                             
  <xs:complexType name="observationPriorityValue">
    <xs:attribute name="type"   type="sss:observationPriorityType" use="required"/>
    <xs:attribute name="value"  type="xs:double"                   use="required"/>
  </xs:complexType>

      <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
      <!-- ||||||||||      Lists        ||||||||| -->
      <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
  <xs:complexType name="executionScriptList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="executionScript" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>     
  <xs:complexType name="programBlockList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="programBlock" type="sss:programBlock"/>
    </xs:sequence>
  </xs:complexType>
         
  <xs:complexType name="schedulingBlockList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:choice minOccurs="0" maxOccurs="1">
        <xs:element name="schedulingBlock"  type="sss:schedulingBlock"/>
        <xs:element name="manualSchedBlock" type="sss:manualSchedBlock"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
        
  <xs:complexType name="executionBlockList">
    <xs:sequence minOccurs="1" maxOccurs="unbounded">
      <xs:element name="executionBlock" type="sss:executionBlock"/>
    </xs:sequence>
  </xs:complexType>
                            
  <xs:complexType name="correlatorInstructionsList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="correlatorInstructions" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
              
  <xs:complexType name="serviceCalibrationList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="serviceCalibration" type="sss:serviceCalibration"/>
    </xs:sequence>
  </xs:complexType>
              
  <xs:complexType name="authorList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="author" type="sss:projectAuthor"/>
    </xs:sequence>
  </xs:complexType>
            
  <xs:complexType name="observationPriorityList">
    <xs:sequence minOccurs="1" maxOccurs="unbounded">
      <xs:element name="observationPriority" type="sss:observationPriority"/>
    </xs:sequence>
  </xs:complexType>
            
  <xs:complexType name="observationPriorityValueList">
    <xs:sequence minOccurs="1" maxOccurs="unbounded">
      <xs:element name="observationPriorityValue" type="sss:observationPriorityValue"/>
    </xs:sequence>
  </xs:complexType>
              
  <xs:complexType name="lstStartRangeList">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:element name="lstStartRange" type="sss:timeOfDayInterval"/>
    </xs:sequence>
  </xs:complexType>
       
  <!-- ================================================== -->
  <!-- ||||||||||||||||  SIMPLE TYPES  |||||||||||||||||| -->
  <!-- ================================================== -->
  
  <!-- ================================================== -->
  <!-- ||||||||||||||||  ENUMERATIONS  |||||||||||||||||| -->
  <!-- ================================================== -->
    
  <xs:simpleType name="projectType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ADJUST"/>
      <xs:enumeration value="LARGE"/>
      <xs:enumeration value="MULTICONFIG"/>
      <xs:enumeration value="SIMPLE"/>
    </xs:restriction>
  </xs:simpleType>
      
  <xs:simpleType name="schedulingType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="DYNAMIC"/>
      <xs:enumeration value="FIXED_DATE"/>
      <xs:enumeration value="MONITORING"/>
      <xs:enumeration value="PERIODIC"/>
    </xs:restriction>
  </xs:simpleType>
      
  <xs:simpleType name="schedulingStatus">
    <xs:restriction base="xs:string">
      <xs:enumeration value="NOT_SUBMITTED"/>
      <xs:enumeration value="SUBMITTED"/>
      <xs:enumeration value="APPROVED"/>
      <xs:enumeration value="SCHEDULABLE"/>
      <xs:enumeration value="ON_HOLD"/>
      <xs:enumeration value="COMPLETED"/>
      <xs:enumeration value="EXPIRED"/>
    </xs:restriction>
  </xs:simpleType>
      
  <xs:simpleType name="executionStatus">
    <xs:restriction base="xs:string">
      <xs:enumeration value="NOT_SCHEDULED"/>
      <xs:enumeration value="QUEUED"/>
      <xs:enumeration value="RUNNING"/>
      <xs:enumeration value="PENDING_COMPLETION"/>
      <xs:enumeration value="PENDING_FAILURE"/>
      <xs:enumeration value="COMPLETED"/>
      <xs:enumeration value="FAILED"/>
    </xs:restriction>
  </xs:simpleType>
      
  <xs:simpleType name="observationPriorityType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="PRIMARY"/>
      <xs:enumeration value="SCIENCE"/>
      <xs:enumeration value="URGENCY"/>
      <xs:enumeration value="STRINGENCY"/>
      <xs:enumeration value="LENGTH"/>
      <xs:enumeration value="NICE"/>
      <xs:enumeration value="OVERRIDE"/>
    </xs:restriction>
  </xs:simpleType>
      
  <xs:simpleType name="serviceCalibrationTiming">
    <xs:restriction base="xs:string">
      <xs:enumeration value="BEFORE_SCHEDULING_BLOCK"/>
      <xs:enumeration value="AFTER_SCHEDULING_BLOCK"/>
      <xs:enumeration value="EITHER_BEFORE_OR_AFTER_SCHEDULING_BLOCK"/>
    </xs:restriction>
  </xs:simpleType>
      
  <xs:simpleType name="alterationStatus">
    <xs:restriction base="xs:string">
      <xs:enumeration value="AUTO_GENERATED_AND_UNALTERED"/>
      <xs:enumeration value="AUTO_GENERATED_THEN_ALTERED"/>
      <xs:enumeration value="MANUALLY_CREATED"/>
      <xs:enumeration value="UNKNOWN"/>
    </xs:restriction>
  </xs:simpleType>
  
</xs:schema>
  
