<?xml version="1.0" encoding="UTF-8"?>
<!--
  Nearcharger partner listing feed (XML) - XSD schema.
  Inbound listing feed template for Nearcharger syndication partners.
  Validates structure and types; custom field names are mapped during onboarding.
  Element order inside <vehicle> is free (xs:all).
  Spec: https://feed-spec.nearcharger.sk/
  Validate: xmllint - -schema listing-template.xsd your-feed.xml
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">

  <xs:element name="feed">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="vehicle" type="vehicleType" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="vehicleType">
    <xs:all>
      <!-- Required fields -->
      <xs:element name="id" type="idType"/>
      <xs:element name="brand" type="nonEmptyString"/>
      <xs:element name="model" type="nonEmptyString"/>
      <xs:element name="year_of_production" type="yearType"/>
      <xs:element name="price" type="positiveDecimal"/>
      <xs:element name="currency" type="currencyType"/>
      <xs:element name="vat_deductible" type="boolType"/>
      <xs:element name="mileage_km" type="xs:nonNegativeInteger"/>
      <xs:element name="status" type="statusType"/>
      <xs:element name="photos" type="photosType"/>

      <!-- Optional: catalog mapping (strongly recommended) -->
      <xs:element name="catalog_id" type="xs:positiveInteger" minOccurs="0"/>
      <xs:element name="variant" type="xs:string" minOccurs="0"/>

      <!-- Recommended (catalog data) -->
      <xs:element name="vin" type="vinType" minOccurs="0"/>
      <xs:element name="engine" type="xs:string" minOccurs="0"/>
      <xs:element name="battery_kwh" type="positiveDecimal" minOccurs="0"/>
      <xs:element name="wltp_range_km" type="xs:nonNegativeInteger" minOccurs="0"/>
      <xs:element name="power_kw" type="xs:nonNegativeInteger" minOccurs="0"/>
      <xs:element name="body_type" type="xs:string" minOccurs="0"/>
      <xs:element name="drive" type="xs:string" minOccurs="0"/>
      <xs:element name="seats" type="seatsType" minOccurs="0"/>

      <!-- Registration + battery warranty -->
      <xs:element name="registration_year" type="yearType" minOccurs="0"/>
      <xs:element name="registration_month" type="monthType" minOccurs="0"/>
      <xs:element name="battery_warranty" type="boolType" minOccurs="0"/>
      <xs:element name="battery_warranty_km" type="xs:nonNegativeInteger" minOccurs="0"/>

      <!-- SoH -->
      <xs:element name="soh" type="percentType" minOccurs="0"/>
      <xs:element name="soh_certificate_url" type="httpsUrl" minOccurs="0"/>
      <xs:element name="soh_measurement_date" type="xs:date" minOccurs="0"/>

      <!-- Appearance -->
      <xs:element name="color_exterior" type="xs:string" minOccurs="0"/>
      <xs:element name="color_interior" type="xs:string" minOccurs="0"/>
      <xs:element name="metallic" type="boolType" minOccurs="0"/>

      <!-- Location -->
      <xs:element name="branch" type="xs:string" minOccurs="0"/>
      <xs:element name="location" type="xs:string" minOccurs="0"/>
      <xs:element name="address" type="xs:string" minOccurs="0"/>
      <xs:element name="gps_lat" type="latType" minOccurs="0"/>
      <xs:element name="gps_lng" type="lngType" minOccurs="0"/>

      <!-- Price details -->
      <xs:element name="price_without_vat" type="positiveDecimal" minOccurs="0"/>
      <xs:element name="original_price" type="positiveDecimal" minOccurs="0"/>

      <!-- Additional -->
      <xs:element name="doors" type="doorsType" minOccurs="0"/>
      <xs:element name="description" type="xs:string" minOccurs="0"/>
      <xs:element name="equipment" type="equipmentType" minOccurs="0"/>
      <xs:element name="condition" type="conditionType" minOccurs="0"/>
      <xs:element name="state" type="stateType" minOccurs="0"/>
    </xs:all>
  </xs:complexType>

  <xs:complexType name="photosType">
    <xs:sequence>
      <xs:element name="photo" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="httpsUrl">
              <!-- main="1" marks the main image; otherwise the first photo is the main one -->
              <xs:attribute name="main" type="boolType" use="optional"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="equipmentType">
    <xs:sequence>
      <xs:element name="item" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Vehicle state flags: ideally Nearcharger slugs from /master-data/enums
       (listing_state group), e.g. first-owner, service-book, imported-vehicle, crashed -->
  <xs:complexType name="stateType">
    <xs:sequence>
      <xs:element name="item" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:simpleType name="idType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[A-Za-z0-9_-]+"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="nonEmptyString">
    <xs:restriction base="xs:string">
      <xs:minLength value="1"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="yearType">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="2010"/>
      <xs:maxInclusive value="2100"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="monthType">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="1"/>
      <xs:maxInclusive value="12"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="positiveDecimal">
    <xs:restriction base="xs:decimal">
      <xs:minExclusive value="0"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="currencyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="EUR"/>
      <xs:enumeration value="CZK"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="statusType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="active"/>
      <xs:enumeration value="available"/>
      <xs:enumeration value="reserved"/>
      <xs:enumeration value="sold"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="conditionType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="new"/>
      <xs:enumeration value="used"/>
      <xs:enumeration value="demo"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Boolean as 0/1 or true/false -->
  <xs:simpleType name="boolType">
    <xs:restriction base="xs:string">
      <xs:pattern value="0|1|true|false"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="vinType">
    <xs:restriction base="xs:string">
      <xs:length value="17"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="percentType">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="100"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="seatsType">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="1"/>
      <xs:maxInclusive value="9"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="doorsType">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="2"/>
      <xs:maxInclusive value="6"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="latType">
    <xs:restriction base="xs:decimal">
      <xs:minInclusive value="-90"/>
      <xs:maxInclusive value="90"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="lngType">
    <xs:restriction base="xs:decimal">
      <xs:minInclusive value="-180"/>
      <xs:maxInclusive value="180"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="httpsUrl">
    <xs:restriction base="xs:anyURI">
      <xs:pattern value="https://.*"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>
