<?xml version="1.0" encoding="utf-8"?>
<xs:schema 
xmlns="http://schemas.gov.sk/form/00166260.Univerzalne_katastralne_podanie.sk/0.1" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:tns="http://schemas.gov.sk/form/00166260.Univerzalne_katastralne_podanie.sk/0.1"
targetNamespace="http://schemas.gov.sk/form/00166260.Univerzalne_katastralne_podanie.sk/0.1" 
elementFormDefault="qualified" 
attributeFormDefault="unqualified">
    <xs:annotation>
        <xs:documentation xml:lang="sk">Univerzálne katastrálne podanie</xs:documentation>
    </xs:annotation>

    <xs:element name="eform">
        <xs:complexType>
            <xs:sequence>

                <!-- BASICS -->
                <xs:element name="PodanieID" type="ExternalIDType"/>
                <xs:element name="CisloPodania" type="CisloPodania" minOccurs="0"/>

                <!-- RECIPIENT  -->
                <xs:element name="PracoviskoKatastra" type="PracoviskoKatastraType"/>

                <!-- LEGAL BASE  -->
                <xs:element name="PredmetNavrhu" type="xs:string" fixed="Univerzálne katastrálne podanie"/>
                <xs:element name="OznacenieUkonu" type="xs:string" fixed=""/>
                <xs:element name="PravnyZaklad" type="xs:string" fixed=""/>

                <!-- PREFERENCES -->
                <xs:element name="SposobDoruceniaPodania" type="xs:string" fixed="Elektronické doručenie"/>

                <!-- ACTORS -->
                <xs:element name="Navrhovatel" type="NavrhovatelType"/>
                <xs:element name="Ucastnici" type="UcastniciType"/>

                <!-- BUSINESS -->
                <xs:element name="PredmetPodania" minOccurs="0">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:minLength value="1"/>
                            <xs:maxLength value="10000"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>

                <!-- ATTACHMENTS -->
                <xs:element name="Prilohy" type="PrilohyType"/>

            </xs:sequence>
        </xs:complexType>

    </xs:element>

    <xs:complexType name="PracoviskoKatastraType">
        <xs:sequence>
            <xs:element name="Kod" type="xs:string"/>
            <xs:element name="Nazov" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="CisloPodania">
        <xs:restriction base="xs:string">
            <xs:pattern value="E-[0-9]{6}/[0-9]{4}"/>
        </xs:restriction>
    </xs:simpleType>

<!-- ACTORS DEFINITION -->


    <!-- Proposer actor -->
    <xs:complexType name="NavrhovatelType">
        <xs:sequence>

            <xs:element name="Subjekt" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence>

                        <xs:element name="SubjektID" type="InternalIDType"/>
                        <xs:element name="TypSubjektu">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:enumeration value="FYZICKAOSOBA"/>
                                    <xs:enumeration value="PRAVNICKAOSOBA"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>

                        <xs:choice>
                            <xs:element name="FyzickaOsoba" type="NavrhovatelFoType"/>
                            <xs:element name="PravnickaOsoba" type="NavrhovatelPoType"/>
                        </xs:choice>

                    </xs:sequence>
                </xs:complexType>
            </xs:element>

        </xs:sequence>
    </xs:complexType>

    <!-- Participant actors -->
    <xs:complexType name="UcastniciType">
        <xs:sequence>

            <xs:element name="Subjekt" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>

                        <xs:element name="SubjektID" type="InternalIDType"/>

                        <xs:element name="TypSubjektu">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:enumeration value="FYZICKAOSOBA"/>
                                    <xs:enumeration value="PRAVNICKAOSOBA"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>

                        <xs:choice>
                            <xs:element name="FyzickaOsoba" type="UcastnikFoType"/>
                            <xs:element name="PravnickaOsoba" type="UcastnikPoType"/>
                        </xs:choice>

                    </xs:sequence>
                </xs:complexType>
            </xs:element>

        </xs:sequence>
    </xs:complexType>

<!-- Actors Subjects type definition -->

    <!-- Request Actor Subjects type definition -->
    <xs:complexType name="NavrhovatelFoType">
        <xs:complexContent>
            <xs:extension base="ActorFoBaseType">
                <xs:sequence>

                    <xs:element name="KontaktneUdaje" type="NavrhovatelKontaktyType"/>

                    <xs:element name="AdresaTrvalehoPobytuPreDorucovanie" type="xs:boolean"/>
                    <xs:element name="AdresaPreDorucovanie" type="AdresaType"  minOccurs="0" maxOccurs="1"/>

                    <xs:element name="UcastnikKonania" type="xs:boolean"/>

                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

     <xs:complexType name="NavrhovatelPoType">
        <xs:complexContent>
            <xs:extension base="ActorPoBaseType">
                <xs:sequence>

                    <xs:element name="KontaktneUdaje" type="NavrhovatelKontaktyType"/>
                    <xs:element name="UcastnikKonania" type="xs:boolean"/>

                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>


    <!-- Business Seller Actor Subjects type definition -->
    <xs:complexType name="UcastnikFoType">
        <xs:complexContent>
            <xs:extension base="ActorFoBaseType">
                <xs:sequence>

                   <xs:element name="AdresaTrvalehoPobytuPreDorucovanie" type="xs:boolean"/>
                   <xs:element name="AdresaPreDorucovanie" type="AdresaType"  minOccurs="0" maxOccurs="1"/>

                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="UcastnikPoType">
        <xs:complexContent>
            <xs:extension base="ActorPoBaseType">
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

<!-- Request actor bussines role -->

    <!-- Actors Subjects details -->
    <xs:complexType name="ActorFoBaseType" abstract="true">
        <xs:sequence>
            <xs:element name="Identifikator" type="IdentifikatorFoType"/>
            <xs:element name="KrstneMeno">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="100"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="Priezvisko">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="100"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="RodnePriezvisko">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="100"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="TitulPredMenom" minOccurs="0">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="50"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="TitulZaMenom" minOccurs="0">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="50"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="DatumNarodenia">
                <xs:simpleType>
                    <!-- Dátum (DD.MM.YYYY) -->
                    <!-- DD.MM.YYYY kde D a M môžu byť bez nulového prefixu -->
                    <!-- Podporuje: 1.1.1985, 01.01.1985, 15.3.2000, atď. -->
                    <xs:restriction base="xs:string">
                        <xs:pattern value="[0-3]?[0-9]\.(0?[1-9]|1[0-2])\.[12][0-9]{3}"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>

            <xs:element name="StatnaPrislusnost" type="StatnaPrislusnostFoType"/>
            <xs:element name="AdresaTrvalehoPobytu" type="AdresaType"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="ActorPoBaseType" abstract="true">
        <xs:sequence>
            <xs:element name="Identifikator" type="IdentifikatorPoType"/>
            <xs:element name="Nazov">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="200"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="Registracia" type="RegistraciaPoType"/>
            <xs:element name="AdresaSidla" type="AdresaType"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="IdentifikatorFoType">
        <xs:sequence>
            <xs:element name="TypIdentifikatora">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="RODNECISLO"/>
                        <xs:enumeration value="ZAHRANICNYIDENTIFIKATOR"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="HodnotaIdentifikatora">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="50"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="IdentifikatorPoType">
        <xs:sequence>
            <xs:element name="TypIdentifikatora">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="ICO"/>
                        <xs:enumeration value="ZAHRANICNYIDENTIFIKATOR"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="HodnotaIdentifikatora">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="50"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="StatnaPrislusnostFoType">
        <xs:sequence>
            <xs:element name="Stat" default="SLOVENSKAREPUBLIKA">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="SLOVENSKAREPUBLIKA"/>
                        <xs:enumeration value="INYSTAT"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="NazovInehoStatu" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="50"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="RegistraciaPoType">
        <xs:sequence>
            <xs:element name="Stat" default="SLOVENSKAREPUBLIKA">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="SLOVENSKAREPUBLIKA"/>
                        <xs:enumeration value="INYSTAT"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="NazovInehoStatu" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="50"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="AdresaType">
        <xs:sequence>
            <xs:element name="Ulica">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="50"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="SupisneCislo">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="10"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="PopisneCislo" minOccurs="0">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="10"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="Obec">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="50"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="Psc">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <!-- PSC: 3-10 znakov, písmená/číslice/medzera/pomlčka (medzinárodný formát) -->
                        <xs:pattern value="[A-Za-z0-9\s\-]{3,10}"/>
                        <xs:minLength value="3"/>
                        <xs:maxLength value="10"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="Stat">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="50"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="NavrhovatelKontaktyType">
        <xs:complexContent>
            <xs:extension base="KontaktyBaseType">
                <xs:sequence>
                    <xs:element name="CisloElektronickejSchranky" >
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <!-- Formát: E + 10 číslic (napr. E0005219996) -->
                                <xs:pattern value="E\d{10}"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                    <xs:element name="AdresaElektronickejSchranky" >
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <!-- Pattern: [prefix]://sk/[alphanumeric_and_underscore] -->
                                <xs:pattern value="[a-zA-Z0-9]+://sk/[a-zA-Z0-9_]+"/>
                                <xs:minLength value="10"/> <!-- Minimum: "x://sk/y" = 9 chars + at least 1 identifier -->
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="KontaktyBaseType" abstract="true">
        <xs:sequence>
            <xs:element name="EmailovaAdresa" minOccurs="0">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <!-- RFC 5322 compliant (zjednodušený pattern) -->
                        <xs:pattern value="[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}"/>
                        <xs:maxLength value="254"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="TelefonneCislo" minOccurs="0">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <!-- Telefónne číslo +[predvoľba 1-3 číslice][medzera?][skupiny 2-3 číslic oddelené voliteľnou medzerou] Príklad: +421 903 123 456 | +421 90 31 23 45 | +421903123456 -->
                        <xs:pattern value="\+[0-9]{1,3}\s?([0-9]{2,3}\s?)+"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <!-- InternalID - string formát -->
    <xs:simpleType name="InternalIDType">
        <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
        </xs:restriction>
    </xs:simpleType>

    <!-- ExternalID - UUID formát -->
    <xs:simpleType name="ExternalIDType">
        <xs:restriction base="xs:string">
            <!-- UUID verzia 4 -->
            <xs:pattern value="[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[89abAB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}"/>
        </xs:restriction>
    </xs:simpleType>

<!-- Attachmnents -->
    <xs:complexType name="PrilohyType">
        <xs:sequence>

            <xs:element name="Navrh" type="PrilohaNavrhType" minOccurs="0" maxOccurs="1"/>
            <xs:element name="Splnomocnenie" type="PrilohaSplnomocnenieType" minOccurs="0" maxOccurs="1"/>
            <xs:element name="DokladZaplatenieSpravnehoPoplatku" type="PrilohaKolokType" minOccurs="0" maxOccurs="1"/>
            <xs:element name="InaPriloha" type="PrilohaInaType" minOccurs="0" maxOccurs="unbounded"/>

        </xs:sequence>
    </xs:complexType>

    <!-- Attachment types -->
    <xs:complexType name="PrilohaNavrhType">
        <xs:complexContent>
            <xs:extension base="PrilohaBaseType">
                <xs:sequence>
                    <xs:element name="TypPrilohy">
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <xs:enumeration value="NAVRH"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                    <xs:element name="Hlavna" type="xs:boolean" fixed="true"/>
                    <xs:element name="Povinna" type="xs:boolean" fixed="true"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="PrilohaKolokType">
        <xs:complexContent>
            <xs:extension base="PrilohaBaseType">
                <xs:sequence>
                    <xs:element name="TypPrilohy">
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <xs:enumeration value="SPRAVNYPOPLATOK"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                    <xs:element name="Povinna" type="xs:boolean" fixed="false"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="PrilohaSplnomocnenieType">
        <xs:complexContent>
            <xs:extension base="PrilohaBaseType">
                <xs:sequence>
                    <xs:element name="TypPrilohy">
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <xs:enumeration value="SPLNOMOCNENIE"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                    <xs:element name="Povinna" type="xs:boolean" fixed="false"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

     <xs:complexType name="PrilohaInaType">
        <xs:complexContent>
            <xs:extension base="PrilohaBaseType">
                <xs:sequence>
                    <xs:element name="TypPrilohy">
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <xs:enumeration value="INAPRILOHA"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                    <xs:element name="Povinna" type="xs:boolean" fixed="false"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="PrilohaBaseType" abstract="true">
        <xs:sequence>
            <xs:element name="Popis">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="1"/>
                        <xs:maxLength value="50"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="Podpisana" type="xs:boolean"/>
            <xs:element name="Subor">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="Nazov">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <!-- Povolené prípony: pdf, xml, xsd, jpg, jpeg, png, tif, tiff, txt, zep, asice, p7s -->
                                    <xs:pattern value="[a-zA-Z0-9_\-\s\(\)]+\.(pdf|xml|xsd|xslt|jpg|jpeg|png|tif|tiff|txt|zep|asice|p7s|docx|xlsx|odt)"/>
                                    <xs:minLength value="5"/>
                                    <xs:maxLength value="255"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="KontrolnySucet">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <!-- SHA256: 64 hexadecimálnych znakov -->
                                    <xs:pattern value="[a-fA-F0-9]{64}"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>

        </xs:sequence>
    </xs:complexType>

</xs:schema>