<?xml version="1.0" encoding="UTF-8"?>
<!--
    For Greyhound Racing Card, Shows and Result Information.

    XML Schema for the DogRacing message, exactly as it is produced by the platform
    (com.pythiasports.pa.model.DogRacing via JAXB).

    Notes:
    - Child elements appear in the order defined by each xs:sequence below.
    - Dates are YYYYMMDD; times are time of day only, hhmm[ss]+/-hhmm (e.g. 1139+0000).
      They are xs:string because those formats are not valid xs:date / xs:time.
    - Boolean flags are sent as "Yes" or "No".
    - Apart from DogRacing@type, every attribute is optional: an attribute is omitted
      when its value is not known.
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.0">

  <!-- ===================== Shared simple types ===================== -->

  <xs:simpleType name="YesNo">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Yes"/>
      <xs:enumeration value="No"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="MessageType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Card"/>
      <xs:enumeration value="Race"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="MeetingState">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Abandoned"/>
      <xs:enumeration value="Active"/>
      <xs:enumeration value="Delayed"/>
      <xs:enumeration value="Dormant"/>
      <xs:enumeration value="Finished"/>
      <xs:enumeration value="Inspection"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="RaceState">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Abandoned"/>
      <xs:enumeration value="Approaching"/>
      <xs:enumeration value="AtThePost"/>
      <xs:enumeration value="Blanket Finish"/>
      <xs:enumeration value="Delayed"/>
      <xs:enumeration value="Dormant"/>
      <xs:enumeration value="FalseStart"/>
      <xs:enumeration value="Final Result"/>
      <xs:enumeration value="Finished"/>
      <xs:enumeration value="GoingBehind"/>
      <xs:enumeration value="GoingDown"/>
      <xs:enumeration value="GoingInStalls"/>
      <xs:enumeration value="Going in traps"/>
      <xs:enumeration value="Hare Failure"/>
      <xs:enumeration value="Hare Running"/>
      <xs:enumeration value="No Race"/>
      <xs:enumeration value="Off"/>
      <xs:enumeration value="Parading"/>
      <xs:enumeration value="Photograph"/>
      <xs:enumeration value="Race Void"/>
      <xs:enumeration value="RaceVoid"/>
      <xs:enumeration value="Rerun"/>
      <xs:enumeration value="Result"/>
      <xs:enumeration value="Stewards Inquiry"/>
      <xs:enumeration value="Stopped for Safety"/>
      <xs:enumeration value="Trap Failure"/>
      <xs:enumeration value="UnderOrders"/>
      <xs:enumeration value="WeighedIn"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="RaceType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Chase"/>
      <xs:enumeration value="Flat"/>
      <xs:enumeration value="Hurdle"/>
      <xs:enumeration value="N_H_Flat"/>
      <xs:enumeration value="Trotting"/>
      <xs:enumeration value="Harness"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- ===================== DogRacing (root) ===================== -->

  <!--
      type   Card = Greyhound Card information, Race = individual race shows and result
      state  Applicable only if type is Card: Advance or Final card
  -->
  <xs:element name="DogRacing">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Meeting" type="Meeting"/>
      </xs:sequence>
      <xs:attribute name="state" type="xs:string"/>
      <xs:attribute name="type" type="MessageType" use="required"/>
    </xs:complexType>
  </xs:element>

  <!-- ===================== Meeting ===================== -->

  <xs:complexType name="Meeting">
    <xs:sequence>
      <xs:element name="Race" type="Race" minOccurs="0" maxOccurs="unbounded"/>
      <!-- List of reserve dogs for the meeting -->
      <xs:element name="ReserveDogs" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Dog" type="Dog" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="country" type="xs:string"/>
    <xs:attribute name="date" type="xs:string"/>
    <xs:attribute name="id" type="xs:string"/>
    <xs:attribute name="meetingId" type="xs:int"/>
    <xs:attribute name="meetingNo" type="xs:int"/>
    <xs:attribute name="revision" type="xs:int"/>
    <xs:attribute name="state" type="MeetingState"/>
    <xs:attribute name="track" type="xs:string"/>
    <xs:attribute name="uuid" type="xs:string"/>
  </xs:complexType>

  <!-- ===================== Race ===================== -->

  <xs:complexType name="Race">
    <xs:sequence>
      <!-- Dividends paid on the result (forecast, tricast) -->
      <xs:element name="Dividends" minOccurs="0">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="Forecast" type="Dividend"/>
            <xs:element name="Tricast" type="Dividend"/>
          </xs:choice>
        </xs:complexType>
      </xs:element>
      <xs:element name="Form" type="Form" minOccurs="0"/>
      <!-- Dogs withdrawn from this race -->
      <xs:element name="NonRunner" type="NonRunner" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="Trap" type="Trap" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="Bags" type="YesNo"/>
    <xs:attribute name="date" type="xs:string"/>
    <xs:attribute name="distance" type="xs:int"/>
    <xs:attribute name="handicap" type="YesNo"/>
    <xs:attribute name="id" type="xs:string"/>
    <xs:attribute name="runners" type="xs:int"/>
    <xs:attribute name="offTime" type="xs:string"/>
    <xs:attribute name="prizes" type="xs:string"/>
    <xs:attribute name="class" type="xs:string"/>
    <xs:attribute name="raceId" type="xs:int"/>
    <xs:attribute name="raceNumber" type="xs:int"/>
    <xs:attribute name="state" type="RaceState"/>
    <xs:attribute name="raceTrial" type="xs:string"/>
    <xs:attribute name="type" type="RaceType"/>
    <xs:attribute name="revision" type="xs:int"/>
    <xs:attribute name="showcase" type="YesNo"/>
    <xs:attribute name="time" type="xs:string"/>
    <xs:attribute name="title" type="xs:string"/>
    <xs:attribute name="trifecta" type="YesNo"/>
    <xs:attribute name="uuid" type="xs:string"/>
    <xs:attribute name="winTime" type="xs:decimal"/>
  </xs:complexType>

  <!-- Forecast: trap1, trap2. Tricast: trap1, trap2, trap3. dividend is paid to a unit stake. -->
  <xs:complexType name="Dividend">
    <xs:attribute name="dividend" type="xs:decimal"/>
    <xs:attribute name="trap1" type="xs:int"/>
    <xs:attribute name="trap2" type="xs:int"/>
    <xs:attribute name="trap3" type="xs:int"/>
  </xs:complexType>

  <!-- ===================== Trap / NonRunner ===================== -->

  <xs:complexType name="Trap">
    <xs:sequence>
      <xs:element name="Dog" type="Dog" minOccurs="0"/>
      <xs:element name="Result" type="Result" minOccurs="0"/>
      <xs:element name="Show" type="Show" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="handicap" type="xs:string"/>
    <xs:attribute name="reasonForTrial" type="xs:string"/>
    <xs:attribute name="reserve" type="YesNo"/>
    <!-- Wide, Mid, Rails or Unknown -->
    <xs:attribute name="seeding" type="xs:string"/>
    <xs:attribute name="trap" type="xs:int"/>
    <xs:attribute name="vacant" type="YesNo"/>
    <xs:attribute name="wide" type="YesNo"/>
  </xs:complexType>

  <xs:complexType name="NonRunner">
    <xs:sequence>
      <xs:element name="Dog" type="Dog" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="trap" type="xs:int"/>
  </xs:complexType>

  <!-- ===================== Dog ===================== -->

  <xs:complexType name="Dog">
    <xs:sequence>
      <xs:element name="BestTime" type="BestTime" minOccurs="0"/>
      <xs:element name="Breeding" type="Breeding" minOccurs="0"/>
      <xs:element name="Form" type="Form" minOccurs="0"/>
      <xs:element name="Owner" type="Owner" minOccurs="0"/>
      <xs:element name="Trainer" type="Trainer" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="cloth" type="xs:int"/>
    <xs:attribute name="form" type="xs:string"/>
    <xs:attribute name="id" type="xs:int"/>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="ngrcid" type="xs:int"/>
    <xs:attribute name="origin" type="xs:string"/>
    <xs:attribute name="uuid" type="xs:string"/>
  </xs:complexType>

  <!-- Fastest run at the same course and distance in the last 3 months (0.00 if none) -->
  <xs:complexType name="BestTime">
    <xs:attribute name="adjustedTime" type="xs:string"/>
    <xs:attribute name="date" type="xs:string"/>
    <xs:attribute name="meetingId" type="xs:string"/>
    <xs:attribute name="class" type="xs:string"/>
    <xs:attribute name="raceNumber" type="xs:string"/>
  </xs:complexType>

  <!-- sex: d = dog, b = bitch. season: bitches only, e.g. 20.Jn.26, Suppressed, Unknown. -->
  <xs:complexType name="Breeding">
    <xs:sequence>
      <xs:element name="Sire" type="ParentDog" minOccurs="0"/>
      <xs:element name="Dam" type="ParentDog" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="sire" type="xs:string"/>
    <xs:attribute name="dam" type="xs:string"/>
    <xs:attribute name="born" type="xs:string"/>
    <xs:attribute name="colour" type="xs:string"/>
    <xs:attribute name="sex" type="xs:string"/>
    <xs:attribute name="season" type="xs:string"/>
  </xs:complexType>

  <!-- Sire / Dam wrapper: short version of Dog details (just name) -->
  <xs:complexType name="ParentDog">
    <xs:sequence>
      <xs:element name="Dog" minOccurs="0">
        <xs:complexType>
          <xs:attribute name="name" type="xs:string"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Owner">
    <xs:attribute name="id" type="xs:int"/>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="uuid" type="xs:string"/>
  </xs:complexType>

  <!-- track: the track this trainer is "local" to -->
  <xs:complexType name="Trainer">
    <xs:attribute name="id" type="xs:int"/>
    <xs:attribute name="name" type="xs:string"/>
    <xs:attribute name="ngrcid" type="xs:int"/>
    <xs:attribute name="track" type="xs:string"/>
    <xs:attribute name="uuid" type="xs:string"/>
  </xs:complexType>

  <!-- ===================== Form ===================== -->

  <!-- The form (list of previous runs) for a dog -->
  <xs:complexType name="Form">
    <xs:sequence>
      <xs:element name="FormRace" type="FormRace" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="FormRace">
    <xs:sequence>
      <xs:element name="FormTrap" type="FormTrap" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="date" type="xs:string"/>
    <xs:attribute name="distance" type="xs:int"/>
    <xs:attribute name="going" type="xs:string"/>
    <xs:attribute name="meetingId" type="xs:int"/>
    <xs:attribute name="raceClass" type="xs:string"/>
    <xs:attribute name="raceNumber" type="xs:int"/>
    <xs:attribute name="time" type="xs:string"/>
    <xs:attribute name="track" type="xs:string"/>
    <xs:attribute name="type" type="xs:string"/>
    <xs:attribute name="winningTime" type="xs:decimal"/>
  </xs:complexType>

  <xs:complexType name="FormTrap">
    <xs:sequence>
      <xs:element name="Dog" type="Dog" minOccurs="0"/>
      <xs:element name="Result" type="Result" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="trap" type="xs:int"/>
    <xs:attribute name="wide" type="YesNo"/>
  </xs:complexType>

  <!-- ===================== Result / prices ===================== -->

  <xs:complexType name="Result">
    <xs:sequence>
      <xs:element name="StartingPrice" type="StartingPrice" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="adjustedTime" type="xs:decimal"/>
    <xs:attribute name="bendPosition" type="xs:string"/>
    <xs:attribute name="btnDistance" type="xs:string"/>
    <xs:attribute name="position" type="xs:string"/>
    <xs:attribute name="runComment" type="xs:string"/>
    <xs:attribute name="runTime" type="xs:decimal"/>
    <xs:attribute name="sectionalTime" type="xs:decimal"/>
    <xs:attribute name="weight" type="xs:decimal"/>
  </xs:complexType>

  <!-- marketPos: 1 = favourite, 2 = second favourite. marketCnt: number sharing that position. -->
  <xs:complexType name="StartingPrice">
    <xs:sequence>
      <xs:element name="Price" type="Price" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="marketCnt" type="xs:int"/>
    <xs:attribute name="marketPos" type="xs:int"/>
  </xs:complexType>

  <xs:complexType name="Show">
    <xs:sequence>
      <xs:element name="Price" type="Price" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="marketNumber" type="xs:int"/>
    <xs:attribute name="timeStamp" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="Price">
    <xs:attribute name="denominator" type="xs:int"/>
    <xs:attribute name="numerator" type="xs:int"/>
  </xs:complexType>

</xs:schema>
