<?xml version="1.0" encoding="UTF-8"?>
<!--
  nayave.com — XSD shema strukturiranog formata događanja (XML varijanta).

  Isti dokument se koristi za UVOZ (POST /api/import/events, admin "Uvoz podataka") i za IZVOZ
  (GET /api/export/events?format=xml). Polja koja izvoz dodaje (eventId, slug, url, occurrences,
  atributi straničenja na korijenu) su opcionalna i uvoz ih ignorira, pa izvezeni dokument
  prolazi ovu istu shemu i može se izravno ponovno uvesti.

  Napomene o parseru (uvoz je namjerno tolerantniji od ove sheme):
    - nazivi elemenata/atributa nisu osjetljivi na velika/mala slova,
    - svaka skalarna vrijednost može stajati u atributu ILI pod-elementu,
    - shema opisuje kanonski (preporučeni) oblik: polja događanja kao pod-elementi,
      polja termina (entry), fotografije (photo) i izračunatog termina (occurrence) kao atributi.

  Obavezna polja kod KREIRANJA novog događanja (kod ažuriranja postojećeg preko eventId/externalId
  nijedno nije obavezno): title, eventType ili eventTypeId, organizer ili organizerId,
  venue ili venueId, te barem jedan schedule/entry sa startDate.
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" attributeFormDefault="unqualified" version="1.0">

  <!-- ================================ Jednostavni tipovi ================================ -->

  <xs:simpleType name="guidType">
    <xs:annotation><xs:documentation xml:lang="hr">GUID zapisa u nayave bazi, npr. "3fa85f64-5717-4562-b3fc-2c963f66afa6".</xs:documentation></xs:annotation>
    <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="statusType">
    <xs:annotation><xs:documentation xml:lang="hr">Status događanja. Objava (Published) zahtijeva organizatora, mjesto i budući termin.</xs:documentation></xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="Draft"/>
      <xs:enumeration value="Published"/>
      <xs:enumeration value="Cancelled"/>
      <xs:enumeration value="Deleted"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="priceTypeType">
    <xs:annotation><xs:documentation xml:lang="hr">Model cijene. Sam priceFrom &gt; 0 postavlja Paid.</xs:documentation></xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="Free"/>
      <xs:enumeration value="Paid"/>
      <xs:enumeration value="Donation"/>
      <xs:enumeration value="Unknown"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="frequencyType">
    <xs:annotation><xs:documentation xml:lang="hr">Ponavljanje termina; izostavljeno = jednokratni termin.</xs:documentation></xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="Daily"/>
      <xs:enumeration value="Weekly"/>
      <xs:enumeration value="Monthly"/>
      <xs:enumeration value="Yearly"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="timeType">
    <xs:annotation><xs:documentation xml:lang="hr">Vrijeme u obliku HH:mm (lokalno, Europe/Zagreb); prihvaća se i H:mm te HH:mm:ss.</xs:documentation></xs:annotation>
    <xs:restriction base="xs:string">
      <xs:pattern value="([01]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="weekDaysType">
    <xs:annotation><xs:documentation xml:lang="hr">Dani u tjednu za tjedno ponavljanje, engleski nazivi odvojeni zarezom/točka-zarezom/razmakom, npr. "Friday,Saturday".</xs:documentation></xs:annotation>
    <xs:restriction base="xs:string"/>
  </xs:simpleType>

  <!-- ================================ Složeni tipovi ================================ -->

  <xs:complexType name="organizerType">
    <xs:annotation><xs:documentation xml:lang="hr">Organizator po podacima — traži se po nazivu, inače se kreira novi. Alternativa je event/organizerId (GUID postojećeg).</xs:documentation></xs:annotation>
    <xs:all>
      <xs:element name="name" type="xs:string" minOccurs="0">
        <xs:annotation><xs:documentation xml:lang="hr">Naziv organizatora — obavezan kad se organizator šalje po podacima.</xs:documentation></xs:annotation>
      </xs:element>
      <xs:element name="email" type="xs:string" minOccurs="0"/>
      <xs:element name="phone" type="xs:string" minOccurs="0"/>
      <xs:element name="website" type="xs:string" minOccurs="0"/>
    </xs:all>
  </xs:complexType>

  <xs:complexType name="venueType">
    <xs:annotation><xs:documentation xml:lang="hr">Mjesto održavanja po podacima. naselje/grad/zupanija se kanonski matchaju sa šifrarnikom naselja; koordinate se automatski popune iz centroida ako nisu poslane. Alternativa je event/venueId (GUID postojećeg).</xs:documentation></xs:annotation>
    <xs:all>
      <xs:element name="name" type="xs:string" minOccurs="0">
        <xs:annotation><xs:documentation xml:lang="hr">Naziv mjesta (dvorana, trg, klub…); bez njega se koristi naselje ili grad.</xs:documentation></xs:annotation>
      </xs:element>
      <xs:element name="address" type="xs:string" minOccurs="0"/>
      <xs:element name="naselje" type="xs:string" minOccurs="0"/>
      <xs:element name="grad" type="xs:string" minOccurs="0"/>
      <xs:element name="zupanija" type="xs:string" minOccurs="0"/>
      <xs:element name="latitude" type="xs:double" minOccurs="0"/>
      <xs:element name="longitude" type="xs:double" minOccurs="0"/>
    </xs:all>
  </xs:complexType>

  <xs:complexType name="scheduleType">
    <xs:sequence>
      <xs:element name="entry" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation><xs:documentation xml:lang="hr">Jedan termin — jednokratni, ili pravilo ponavljanja kad je postavljen frequency. startDate je obavezan; bez startTime termin je cjelodnevan.</xs:documentation></xs:annotation>
        <xs:complexType>
          <xs:attribute name="startDate" type="xs:date" use="required"/>
          <xs:attribute name="startTime" type="timeType"/>
          <xs:attribute name="endDate" type="xs:date">
            <xs:annotation><xs:documentation xml:lang="hr">Za cjelodnevna događanja: zadnji dan raspona ("od–do").</xs:documentation></xs:annotation>
          </xs:attribute>
          <xs:attribute name="endTime" type="timeType"/>
          <xs:attribute name="durationMinutes" type="xs:nonNegativeInteger"/>
          <xs:attribute name="allDay" type="xs:boolean"/>
          <xs:attribute name="frequency" type="frequencyType"/>
          <xs:attribute name="interval" type="xs:positiveInteger"/>
          <xs:attribute name="byWeekDays" type="weekDaysType"/>
          <xs:attribute name="untilDate" type="xs:date"/>
          <xs:attribute name="count" type="xs:positiveInteger"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="photosType">
    <xs:sequence>
      <xs:element name="photo" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation><xs:documentation xml:lang="hr">Fotografija: javni url ILI base64 sadržaj (u atributu base64 ili kao tekst elementa, uz fileName). Prva postaje naslovna.</xs:documentation></xs:annotation>
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="url" type="xs:anyURI"/>
              <xs:attribute name="fileName" type="xs:string"/>
              <xs:attribute name="caption" type="xs:string"/>
              <xs:attribute name="base64" type="xs:string"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="occurrencesType">
    <xs:annotation><xs:documentation xml:lang="hr">Samo u izvozu: izračunati (materijalizirani) termini unutar traženog razdoblja — ponavljanja su već razmotana. Uvoz ovaj element ignorira.</xs:documentation></xs:annotation>
    <xs:sequence>
      <xs:element name="occurrence" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="start" type="xs:dateTime" use="required">
            <xs:annotation><xs:documentation xml:lang="hr">Početak, lokalno vrijeme (Europe/Zagreb), bez oznake zone.</xs:documentation></xs:annotation>
          </xs:attribute>
          <xs:attribute name="end" type="xs:dateTime" use="required"/>
          <xs:attribute name="allDay" type="xs:boolean"/>
          <xs:attribute name="cancelled" type="xs:boolean">
            <xs:annotation><xs:documentation xml:lang="hr">Pojedinačno otkazan termin (navodi se samo kad je true).</xs:documentation></xs:annotation>
          </xs:attribute>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="eventType">
    <xs:all>
      <!-- Identifikacija -->
      <xs:element name="eventId" type="guidType" minOccurs="0">
        <xs:annotation><xs:documentation xml:lang="hr">GUID postojećeg događanja — uvoz ga ažurira (mora postojati). U izvozu: ID zapisa.</xs:documentation></xs:annotation>
      </xs:element>
      <xs:element name="externalId" type="xs:string" minOccurs="0">
        <xs:annotation><xs:documentation xml:lang="hr">Vaš stabilni ključ — ponovni uvoz istog dokumenta ažurira umjesto da duplicira. Preporučeno za sinkronizacije.</xs:documentation></xs:annotation>
      </xs:element>

      <!-- Sadržaj (title je obavezan za novo događanje) -->
      <xs:element name="title" type="xs:string" minOccurs="0"/>
      <xs:element name="summary" type="xs:string" minOccurs="0"/>
      <xs:element name="description" type="xs:string" minOccurs="0"/>
      <xs:element name="eventTypeId" type="guidType" minOccurs="0"/>
      <xs:element name="eventType" type="xs:string" minOccurs="0">
        <xs:annotation><xs:documentation xml:lang="hr">Tip iz šifrarnika: naziv ("Koncert"), slug ("koncert") ili redni broj ("5"). Za novo događanje obavezan je eventType ili eventTypeId.</xs:documentation></xs:annotation>
      </xs:element>
      <xs:element name="status" type="statusType" minOccurs="0"/>

      <!-- Organizator i mjesto (za novo događanje obavezno jedno od ID/objekt) -->
      <xs:element name="organizerId" type="guidType" minOccurs="0"/>
      <xs:element name="organizer" type="organizerType" minOccurs="0"/>
      <xs:element name="venueId" type="guidType" minOccurs="0"/>
      <xs:element name="venue" type="venueType" minOccurs="0"/>

      <!-- Festival hijerarhija -->
      <xs:element name="parentId" type="guidType" minOccurs="0"/>
      <xs:element name="parentExternalId" type="xs:string" minOccurs="0">
        <xs:annotation><xs:documentation xml:lang="hr">externalId nadređenog festivala navedenog ranije u istom dokumentu (ili ranije uvezenog).</xs:documentation></xs:annotation>
      </xs:element>

      <!-- Cijena i poveznice -->
      <xs:element name="priceType" type="priceTypeType" minOccurs="0"/>
      <xs:element name="priceFrom" type="xs:decimal" minOccurs="0"/>
      <xs:element name="currency" type="xs:string" minOccurs="0"/>
      <xs:element name="ticketUrl" type="xs:anyURI" minOccurs="0"/>
      <xs:element name="sourceUrl" type="xs:anyURI" minOccurs="0"/>

      <!-- Termini i fotografije (za novo događanje obavezan barem jedan schedule/entry) -->
      <xs:element name="schedule" type="scheduleType" minOccurs="0"/>
      <xs:element name="photos" type="photosType" minOccurs="0"/>
      <xs:element name="replacePhotos" type="xs:boolean" minOccurs="0">
        <xs:annotation><xs:documentation xml:lang="hr">Kod ažuriranja: obriši postojeću galeriju i stavi fotografije iz ovog dokumenta.</xs:documentation></xs:annotation>
      </xs:element>

      <!-- Samo u izvozu (uvoz ih ignorira) -->
      <xs:element name="slug" type="xs:string" minOccurs="0"/>
      <xs:element name="url" type="xs:anyURI" minOccurs="0">
        <xs:annotation><xs:documentation xml:lang="hr">Javna stranica događanja na nayave.com.</xs:documentation></xs:annotation>
      </xs:element>
      <xs:element name="isFeatured" type="xs:boolean" minOccurs="0"/>
      <xs:element name="updatedAtUtc" type="xs:dateTime" minOccurs="0"/>
      <xs:element name="occurrences" type="occurrencesType" minOccurs="0"/>
    </xs:all>
  </xs:complexType>

  <!-- ================================ Korijen ================================ -->

  <xs:element name="events">
    <xs:annotation><xs:documentation xml:lang="hr">Korijenski element. Atributi straničenja (page, totalCount…) pojavljuju se samo u izvozu.</xs:documentation></xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element name="event" type="eventType" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:attribute name="allowDuplicates" type="xs:boolean">
        <xs:annotation><xs:documentation xml:lang="hr">Uvezi i retke koji izgledaju kao duplikat (isti naziv i datum na drugoj lokaciji).</xs:documentation></xs:annotation>
      </xs:attribute>
      <xs:attribute name="generatedAtUtc" type="xs:dateTime"/>
      <xs:attribute name="page" type="xs:positiveInteger"/>
      <xs:attribute name="pageSize" type="xs:positiveInteger"/>
      <xs:attribute name="totalCount" type="xs:nonNegativeInteger"/>
      <xs:attribute name="totalPages" type="xs:nonNegativeInteger"/>
    </xs:complexType>
  </xs:element>

</xs:schema>
