<?xml version="1.0" encoding="utf-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">

  <xs:annotation>
    <xs:documentation>
      DX1 Inventory on Demand XML feed schema, version 2.0.
      This initial no-namespace schema validates the current full-feed structure.
    </xs:documentation>
  </xs:annotation>

  <!-- Reusable scalar types -->

  <xs:simpleType name="UuidType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="NonNegativeMoneyType">
    <xs:restriction base="xs:decimal">
      <xs:minInclusive value="0"/>
      <xs:fractionDigits value="2"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="PositiveSequenceType">
    <xs:restriction base="xs:positiveInteger"/>
  </xs:simpleType>

  <xs:simpleType name="ModelYearType">
    <xs:restriction base="xs:gYear"/>
  </xs:simpleType>

  <xs:simpleType name="CurrencyCodeType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[A-Z]{3}"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Root document -->

  <xs:element name="inventoryFeed" type="InventoryFeedType"/>

  <xs:complexType name="InventoryFeedType">
    <xs:sequence>
      <xs:element name="provider" type="ProviderType"/>
      <xs:element name="dealer" type="DealerType"/>
      <xs:element name="inventoryUnits" type="InventoryUnitsType"/>
    </xs:sequence>
    <xs:attribute name="version" use="required" fixed="2.0"/>
    <xs:attribute name="generatedAt" type="xs:dateTime" use="required"/>
  </xs:complexType>

  <xs:complexType name="ProviderType">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="system" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="DealerType">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="location" type="LocationType"/>
      <xs:element name="websiteUrl" type="xs:anyURI" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="id" type="UuidType" use="required"/>
  </xs:complexType>

  <xs:complexType name="LocationType">
    <xs:sequence>
      <xs:element name="address1" type="xs:string" minOccurs="0"/>
      <xs:element name="address2" 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="postalCode" type="xs:string" minOccurs="0"/>
      <xs:element name="country" type="xs:string" minOccurs="0"/>
      <xs:element name="phone" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="InventoryUnitsType">
    <xs:sequence>
      <xs:element
          name="inventoryUnit"
          type="InventoryUnitType"
          minOccurs="0"
          maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="InventoryUnitType">
    <xs:sequence>

      <!-- Optional planned metadata fields -->
      <xs:element name="createdAt" type="xs:dateTime" minOccurs="0"/>
      <xs:element name="updatedAt" type="xs:dateTime" minOccurs="0"/>

      <xs:element name="make" type="xs:string"/>
      <xs:element name="modelCode" type="xs:string"/>
      <xs:element name="modelName" type="xs:string"/>
      <xs:element name="year" type="ModelYearType"/>
      <xs:element name="category" type="xs:string"/>
      <xs:element name="type" type="xs:string"/>
      <xs:element name="manufacturerCategory" type="xs:string" minOccurs="0"/>
      <xs:element name="stockNumber" type="xs:string"/>
      <xs:element name="vin" type="xs:string" minOccurs="0"/>
      <xs:element name="condition" type="xs:string"/>
      <xs:element name="isCertifiedPreOwned" type="xs:boolean"/>
      <xs:element name="isRental" type="xs:boolean"/>
      <xs:element name="primaryColor" type="xs:string" minOccurs="0"/>
      <xs:element name="detailUrl" type="xs:anyURI"/>
      <xs:element name="tagline" type="xs:string" minOccurs="0"/>
      <xs:element name="description" type="xs:string" minOccurs="0"/>
      <xs:element name="displayTags" type="DisplayTagsType" minOccurs="0"/>
      <xs:element name="odometer" type="OdometerType" minOccurs="0"/>
      <xs:element name="media" type="MediaType" minOccurs="0"/>
      <xs:element name="pricing" type="PricingType" minOccurs="0"/>
      <xs:element name="specifications" type="SpecificationsType" minOccurs="0"/>
    </xs:sequence>

    <xs:attribute name="id" type="UuidType" use="required"/>
  </xs:complexType>

  <xs:complexType name="DisplayTagsType">
    <xs:sequence>
      <xs:element
          name="tag"
          type="xs:string"
          minOccurs="1"
          maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="OdometerType">
    <xs:sequence>
      <xs:element name="value" type="xs:decimal"/>
      <xs:element name="unit" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="MediaType">
    <xs:sequence>
      <xs:element
          name="mediaItem"
          type="MediaItemType"
          minOccurs="1"
          maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="MediaItemType">
    <xs:sequence>
      <xs:element name="seq" type="PositiveSequenceType"/>
      <xs:element name="type" type="xs:string"/>
      <xs:element name="source" type="xs:string"/>
      <xs:element name="url" type="xs:anyURI"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="PricingType">
    <xs:sequence>
      <xs:element name="retailPrice" type="NonNegativeMoneyType" minOccurs="0"/>
      <xs:element name="retailPriceLabel" type="xs:string" minOccurs="0"/>
      <xs:element name="currentPrice" type="NonNegativeMoneyType" minOccurs="0"/>
      <xs:element name="currentPriceLabel" type="xs:string" minOccurs="0"/>
      <xs:element name="offers" type="OffersType" minOccurs="0"/>
      <xs:element name="charges" type="ChargesType" minOccurs="0"/>
      <xs:element name="totalPrice" type="NonNegativeMoneyType" minOccurs="0"/>
      <xs:element name="totalPriceLabel" type="xs:string" minOccurs="0"/>
      <xs:element name="isPriceHidden" type="xs:boolean"/>
    </xs:sequence>

    <xs:attribute
        name="currency"
        type="CurrencyCodeType"
        use="required"/>
  </xs:complexType>

  <xs:complexType name="OffersType">
    <xs:sequence>
      <xs:element
          name="offer"
          type="PriceAdjustmentType"
          minOccurs="1"
          maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="ChargesType">
    <xs:sequence>
      <xs:element
          name="charge"
          type="PriceAdjustmentType"
          minOccurs="1"
          maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="PriceAdjustmentType">
    <xs:sequence>
      <xs:element name="type" type="xs:string"/>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="amount" type="NonNegativeMoneyType"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="SpecificationsType">
    <xs:sequence>
      <xs:element
          name="specification"
          type="SpecificationType"
          minOccurs="1"
          maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="SpecificationType">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="value" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>
