﻿<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- AGA Tournament Schema.  Version date: 2009-05-14 -->

<!-- CHANGE LOG -->
<!-- 2009-05-14: 
  Fixed incorrect comment marker
  Moved comment marker below document root
-->

  <xs:element name="TournamentReport">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Header" type="HeaderType"/>
        <xs:element name="PlayerList" type="PlayerListType"/>
        <xs:element name="TeamList" type="TeamListType" minOccurs="0"/>
        <xs:element name="RoundList" type="RoundListType" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  
    <!-- Define player ID as a key: requires ID to be both present and unique -->    
    <xs:key name="PlayerIDKey">
      <xs:selector xpath="./PlayerList/Player"/>
      <xs:field xpath="@ID"/>
    </xs:key>
    
    <!-- Define Team Number as a key: requires ID to be unique -->
    <xs:unique name="TeamNumberKey">
      <xs:selector xpath="./TeamList/Team"/>
      <xs:field xpath="@TeamNumber"/>
    </xs:unique>

    <!-- Ensure that the ID numbers used in game report and team entries refer to a valid player -->
    <!-- White player constraint -->
    <xs:keyref name="GameWhitePlayerKeyref" refer="PlayerIDKey">
      <xs:selector xpath="./RoundList/Round/Game"/>
      <xs:field xpath="@WhitePlayerID"/>
    </xs:keyref>

    <!-- Black player constraint -->
    <xs:keyref name="GameBlackPlayerKeyref" refer="PlayerIDKey">
      <xs:selector xpath="./RoundList/Round/Game"/>
      <xs:field xpath="@BlackPlayerID"/>
    </xs:keyref>
    
    <!-- Team member constraint -->
    <xs:keyref name="TeamMemberKeyref" refer="PlayerIDKey">
      <xs:selector xpath="./TeamList/Team/Member"/>
      <xs:field xpath="@ID"/>
    </xs:keyref>
  </xs:element>


  <xs:complexType name="PlayerListType">
  
    <xs:sequence>
      <xs:element name="Player" type="PlayerType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="HeaderType">
    <xs:sequence>
      <xs:element name="Software" type="xs:string"/>
      <xs:element name="TournamentName" type="xs:string"/>
      <xs:element name="TournamentVenue" type="ContactInfoType" minOccurs="0"/>
      <xs:element name="TournamentDirector" type="ContactInfoType"/>
      <xs:element name="TournamentSponsor" type="ContactInfoType" minOccurs="0"/>
      <xs:element name="TournamentConvenor" type="ContactInfoType" minOccurs="0"/>      
      <xs:element name="StartDate" type="xs:date"/>
      <xs:element name="EndDate" type="xs:date" minOccurs="0"/>
      <xs:element name="PairingFormat" type="xs:string" minOccurs="0"/>
      <xs:element name="Rules" type="xs:string"/>
      <xs:element name="BasicTime" type="xs:positiveInteger" minOccurs="0"/> <!-- Basic time in minutes -->
      <xs:element name="OvertimeFormat" type="OvertimeType" minOccurs="0"/>
      <xs:element name="TiebreakSystemList" type="TiebreakSystemListType"/>
      <xs:element name="TournamentStaffList" type="TournamentStaffListType" minOccurs="0"/>
      <xs:element name="Comment" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="ContactInfoType">
    <xs:sequence>
      <xs:element name="Name" type="xs:string"/>            <!--Full name -->
      <xs:element name="Address" type="AddressType" minOccurs="0"/>
    </xs:sequence>  
  </xs:complexType>
  
  <xs:complexType name="TournamentStaffListType">
    <xs:sequence>
      <xs:element name="Staff" type="StaffType" maxOccurs="unbounded"/>
    </xs:sequence>  
  </xs:complexType>
  
  <xs:complexType name="StaffType">
    <xs:sequence>
      <xs:element name="Name" type="xs:string"/>
      <xs:element name="Position" type="xs:string"/>
      <xs:element name="Address" type="AddressType" minOccurs="0"/>
    </xs:sequence>  
  </xs:complexType>
 
   <xs:complexType name="AddressType">
    <!-- Address elements as generic are as possible to allow for foreign members -->
    <!-- This is also the same address type used for sponsors etc, so some fields (e.g. web) may not be very useful for individual members -->
    <xs:sequence>
      <xs:element name="Address1" type="xs:string"  minOccurs="0"/>
      <xs:element name="Address2" type="xs:string"  minOccurs="0"/>
      <xs:element name="Address3" type="xs:string"  minOccurs="0"/>
      <xs:element name="City" type="xs:string"  minOccurs="0"/>
      <xs:element name="State" type="xs:string"  minOccurs="0"/>
      <xs:element name="ZipCode" type="xs:string"  minOccurs="0"/>                        <!-- For AGA activities this would be the ZIP code, for others, a postal code -->
      <xs:element name="Country" type="xs:string" minOccurs="0"/>
      <xs:element name="Email" type="xs:string"  minOccurs="0"/>
      <xs:element name="Phone" type="xs:string" minOccurs="0"/>
      <xs:element name="Web" type="xs:anyURI" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType> 
 
  <xs:complexType name="PlayerType">
      <xs:sequence>
        <xs:element name="Citizenship" type="xs:string" minOccurs="0"/>
        <xs:element name="Birthday" type="xs:date" minOccurs="0"/>                                  <!-- For youth memberships -->
        <xs:element name="Address" type="AddressType" minOccurs="0"/>
        <xs:element name="Membership" type="MembershipType" minOccurs="0"/>
        <xs:element name="FinalStanding" type="xs:positiveInteger" minOccurs="0"/>
        <xs:element name="Tiebreak" type="TiebreakValueListType" minOccurs="0"/>
      </xs:sequence>
      <xs:attribute name="ID" type="xs:positiveInteger" use="required"/>
      <xs:attribute name="GivenName" type="xs:string" use="required"/>
      <xs:attribute name="FamilyName" type="xs:string" use="required"/>
      <xs:attribute name="Rating" type="RatingType" use="required"/>
      <xs:attribute name="InitialTournamentScore" type="xs:integer" use="required"/>
    </xs:complexType>
  
  <xs:simpleType name="RatingType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9]*[kdpKDP]|[+\-]?\d+\.\d+"/>   <!-- Accept ratings as 3k/5d/9p... or in decimal form -->
    </xs:restriction>
  </xs:simpleType>
      
  <xs:complexType name="MembershipType">
      <xs:attribute name="Class" type="xs:string" use="required"/>
      <xs:attribute name="Fee" type="xs:decimal" use="required"/>
      <xs:attribute name="ChapterAffiliation" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="TiebreakSystemListType">
    <xs:sequence>
      <xs:element name="System" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="Tier" type="xs:string" use="required"/>            <!-- Indicates the order of the tiebreak system in resolving ties.  First tiebreak is tier 1, etc -->
          <xs:attribute name="Method" type="xs:string" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="TiebreakValueListType">
    <xs:sequence>
      <xs:element name="System" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="Tier" type="xs:string" use="required"/>      
          <xs:attribute name="Value" type="xs:decimal" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="RoundListType">
    <xs:sequence>
      <xs:element name="Round" type="RoundType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>  
 
  <xs:complexType name="RoundType">
    <xs:sequence>
        <xs:element name="Game" type="GameReportType" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="RoundNumber" type="xs:positiveInteger" use="required"/>
  </xs:complexType>

  <!-- Record byes as the same player with both black and white -->
  <xs:complexType name="GameReportType">
     <xs:sequence>
        <xs:element name="SGFRecord" type="xs:string" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
      <xs:attribute name="BlackPlayerID" type="xs:positiveInteger" use="required"/>
      <xs:attribute name="WhitePlayerID" type="xs:positiveInteger" use="required"/>
      <xs:attribute name="Komi" type="xs:decimal" use="required"/>
      <xs:attribute name="Handicap" type="xs:nonNegativeInteger" use="required"/>
      <xs:attribute name="GameResult" type="GameResultType" use="required"/> 
  </xs:complexType>
 
  <xs:simpleType name="GameResultType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Black Win"/>
      <xs:enumeration value="White Win"/>
      <xs:enumeration value="Draw"/>
      <xs:enumeration value="Void"/>      
      <xs:enumeration value="Black Forfeit"/>
      <xs:enumeration value="White Forfeit"/>
      <xs:enumeration value="Double Loss"/>
      <xs:enumeration value="Double Forfeit"/>
      <xs:enumeration value="Voluntary Bye"/>
      <xs:enumeration value="Involuntary Bye"/>
	  <xs:enumeration value="Unknown"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:complexType name="OvertimeType">
    <xs:choice>
    
      <xs:element name="Canadian">
        <xs:complexType>
          <xs:attribute name="StoneCount" type="xs:positiveInteger"/>
          <xs:attribute name="TimeBlockSize" type="xs:positiveInteger"/>    <!-- Indicates an overtime of StoneCount stones in TimeBlockSize minutes -->
        </xs:complexType>
      </xs:element>
      
      <xs:element name="ByoYomi">
        <xs:complexType>
            <xs:attribute name="TimeBlockCount" type="xs:positiveInteger"/>
            <xs:attribute name="TimeBlockSize" type="xs:positiveInteger"/>    <!-- Indicates an overtime of ByoYomiUnitCount blocks of ByoYomiTimeBlock seconds -->
        </xs:complexType>
      </xs:element>
      
      <xs:element name="Fischer">
        <xs:complexType>
          <xs:attribute name="TimeIncrement" type="xs:positiveInteger"/>  	  <!-- Indicate the number of seconds added per move -->
        </xs:complexType>            
      </xs:element> 
      
      <xs:element name="SuddenDeath"/>          <!--Data value unimportant and ignored -->
      
    </xs:choice>
  </xs:complexType>
  
  <xs:complexType name="TeamType">
    <xs:sequence>
      <xs:element name="Member" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="ID" type="xs:positiveInteger"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="TeamName" type="xs:string" use="required"/>
    <xs:attribute name="TeamNumber" type="xs:positiveInteger" use="required"/>
  </xs:complexType>
  
  
  <xs:complexType name="TeamListType">
    <xs:sequence>
      <xs:element name="Team" type="TeamType" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  
</xs:schema>