<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:sr="https://schema-resume.org/xml/1.0"
           targetNamespace="https://schema-resume.org/xml/1.0"
           elementFormDefault="qualified"
           version="1.3.0">

  <xs:annotation>
    <xs:documentation>
      Schema Resume XML Schema Definition (XSD) v1.3.0
      Self-hosted XML schema for CV/Resume validation with work authorization and tools tracking
      
      This schema provides comprehensive validation for resume/CV documents in XML format.
      It includes support for personal information, work history, education, skills, projects,
      and more, with semantic web integration through Schema.org types.
      
      Primary domain: https://schema-resume.org/
      Alternate domain: https://tradik.github.io/schema-resume/
      
      Version: 1.3.0
      License: MIT
      Repository: https://github.com/tradik/schema-resume
    </xs:documentation>
  </xs:annotation>

  <!-- Root Element -->
  <xs:element name="resume" type="sr:ResumeType">
    <xs:annotation>
      <xs:documentation>Root element containing all resume information</xs:documentation>
    </xs:annotation>
  </xs:element>

  <!-- Simple Types -->
  <xs:simpleType name="iso8601DateType">
    <xs:annotation>
      <xs:documentation>Date in ISO 8601 format with flexible precision</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:pattern value="[1-2][0-9]{3}(-[0-1][0-9](-[0-3][0-9])?)?"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="workTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="remote"/>
      <xs:enumeration value="hybrid"/>
      <xs:enumeration value="onsite"/>
      <xs:enumeration value="full-time"/>
      <xs:enumeration value="part-time"/>
      <xs:enumeration value="contract"/>
      <xs:enumeration value="freelance"/>
      <xs:enumeration value="internship"/>
      <xs:enumeration value="temporary"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="proficiencyLevelType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Beginner"/>
      <xs:enumeration value="Intermediate"/>
      <xs:enumeration value="Advanced"/>
      <xs:enumeration value="Expert"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="languageFluencyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Native"/>
      <xs:enumeration value="Fluent"/>
      <xs:enumeration value="Intermediate"/>
      <xs:enumeration value="Basic"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="countryCodeType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[A-Z]{2}"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- Helper Types -->
  <xs:complexType name="StringListType">
    <xs:sequence>
      <xs:element name="item" type="xs:string" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Main Resume Type -->
  <xs:complexType name="ResumeType">
    <xs:sequence>
      <xs:element name="basics" type="sr:BasicsType" minOccurs="0"/>
      <xs:element name="work" type="sr:WorkType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="volunteer" type="sr:VolunteerType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="education" type="sr:EducationType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="awards" type="sr:AwardType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="certificates" type="sr:CertificateType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="publications" type="sr:PublicationType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="skills" type="sr:SkillType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="tools" type="sr:ToolType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="languages" type="sr:LanguageType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="interests" type="sr:InterestType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="references" type="sr:ReferenceType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="projects" type="sr:ProjectType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="meta" type="sr:MetaType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!--
    Protected personal characteristics. Omit unless the receiving market expects
    them: in the UK and most of the EU a CV should not carry age, date of birth
    or gender. Grouped so that including them is a deliberate choice and a
    processor can strip them in one step.
  -->
  <xs:complexType name="DemographicsType">
    <xs:sequence>
      <xs:element name="age" type="xs:integer" minOccurs="0"/>
      <xs:element name="dateOfBirth" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="gender" type="xs:string" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="type" type="xs:string"/>
  </xs:complexType>

  <!-- Basics Section -->
  <xs:complexType name="BasicsType">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="label" type="xs:string" minOccurs="0"/>
      <xs:element name="title" type="xs:string" minOccurs="0"/>
      <!-- DEPRECATED since 1.3.0: use <demographics>. Kept, in their original
           sequence position, so every 1.x document keeps validating. -->
      <xs:element name="age" type="xs:integer" minOccurs="0"/>
      <xs:element name="dateOfBirth" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="gender" type="xs:string" minOccurs="0"/>
      <xs:element name="demographics" type="sr:DemographicsType" minOccurs="0"/>
      <xs:element name="legalNote" type="sr:LegalNoteType" minOccurs="0"/>
      <xs:element name="image" type="xs:anyURI" minOccurs="0"/>
      <xs:element name="email" type="xs:string" minOccurs="0"/>
      <xs:element name="phone" type="xs:string" minOccurs="0"/>
      <xs:element name="url" type="xs:anyURI" minOccurs="0"/>
      <xs:element name="summary" type="xs:string" minOccurs="0"/>
      <xs:element name="keyAchievements" type="sr:StringListType" minOccurs="0"/>
      <xs:element name="coreCompetencies" type="sr:StringListType" minOccurs="0"/>
      <xs:element name="location" type="sr:LocationType" minOccurs="0"/>
      <xs:element name="profiles" type="sr:ProfilesType" minOccurs="0"/>
      <xs:element name="nationalities" type="sr:NationalitiesType" minOccurs="0"/>
      <xs:element name="workAuthorization" type="sr:WorkAuthorizationType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="LocationType">
    <xs:sequence>
      <xs:element name="address" type="xs:string" minOccurs="0"/>
      <xs:element name="streetAddress" type="xs:string" minOccurs="0"/>
      <xs:element name="postalCode" type="xs:string" minOccurs="0"/>
      <xs:element name="city" type="xs:string" minOccurs="0"/>
      <xs:element name="countryCode" type="sr:countryCodeType" minOccurs="0"/>
      <xs:element name="region" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="ProfilesType">
    <xs:sequence>
      <xs:element name="profile" type="sr:ProfileType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="ProfileType">
    <xs:sequence>
      <xs:element name="network" type="xs:string" minOccurs="0"/>
      <xs:element name="username" type="xs:string" minOccurs="0"/>
      <xs:element name="url" type="xs:anyURI" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="NationalitiesType">
    <xs:sequence>
      <xs:element name="nationality" type="sr:NationalityType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="NationalityType">
    <xs:sequence>
      <xs:element name="country" type="sr:countryCodeType" minOccurs="0"/>
      <xs:element name="born" type="xs:boolean" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="WorkAuthorizationType">
    <xs:sequence>
      <xs:element name="authorization" type="sr:WorkAuthorizationEntryType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="WorkAuthorizationEntryType">
    <xs:sequence>
      <xs:element name="country" type="sr:countryCodeType"/>
      <xs:element name="status" type="xs:string" minOccurs="0"/>
      <xs:element name="rightToWork" type="xs:boolean" minOccurs="0"/>
      <xs:element name="visaType" type="xs:string" minOccurs="0"/>
      <xs:element name="validFrom" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="validTo" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="notes" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Work Section -->
  <xs:complexType name="WorkType">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="industry" type="xs:string" minOccurs="0"/>
      <xs:element name="location" type="sr:WorkLocationAddressType" minOccurs="0"/>
      <xs:element name="workLocation" type="xs:string" minOccurs="0"/>
      <xs:element name="contactDetails" type="sr:ContactDetailsType" minOccurs="0"/>
      <xs:element name="description" type="xs:string" minOccurs="0"/>
      <xs:element name="position" type="xs:string" minOccurs="0"/>
      <xs:element name="workType" type="sr:workTypeEnum" minOccurs="0"/>
      <xs:element name="url" type="xs:anyURI" minOccurs="0"/>
      <xs:element name="startDate" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="endDate" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="summary" type="xs:string" minOccurs="0"/>
      <xs:element name="highlights" type="sr:StringListType" minOccurs="0"/>
      <xs:element name="positions" type="sr:PositionListType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Multiple roles held at the same organization over time (career progression) -->
  <xs:complexType name="PositionListType">
    <xs:sequence>
      <xs:element name="item" type="sr:PositionType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="PositionType">
    <xs:sequence>
      <xs:element name="position" type="xs:string" minOccurs="0"/>
      <xs:element name="workType" type="sr:workTypeEnum" minOccurs="0"/>
      <xs:element name="startDate" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="endDate" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="summary" type="xs:string" minOccurs="0"/>
      <xs:element name="highlights" type="sr:StringListType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="WorkLocationAddressType">
    <xs:sequence>
      <xs:element name="address" type="xs:string" minOccurs="0"/>
      <xs:element name="city" type="xs:string" minOccurs="0"/>
      <xs:element name="region" type="xs:string" minOccurs="0"/>
      <xs:element name="postalCode" type="xs:string" minOccurs="0"/>
      <xs:element name="countryCode" type="sr:countryCodeType" minOccurs="0"/>
      <xs:element name="country" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="ContactDetailsType">
    <xs:sequence>
      <xs:element name="email" type="xs:string" minOccurs="0"/>
      <xs:element name="phone" type="xs:string" minOccurs="0"/>
      <xs:element name="fax" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Legal disclaimers, consent statements, or data processing notes -->
  <xs:complexType name="LegalNoteType">
    <xs:sequence>
      <xs:element name="text" type="xs:string" minOccurs="0"/>
      <xs:element name="country" type="sr:countryCodeType" minOccurs="0"/>
      <xs:element name="type" type="xs:string" minOccurs="0"/>
      <xs:element name="url" type="xs:anyURI" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Volunteer Section -->
  <xs:complexType name="VolunteerType">
    <xs:sequence>
      <xs:element name="organization" type="xs:string" minOccurs="0"/>
      <xs:element name="position" type="xs:string" minOccurs="0"/>
      <xs:element name="url" type="xs:anyURI" minOccurs="0"/>
      <xs:element name="startDate" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="endDate" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="summary" type="xs:string" minOccurs="0"/>
      <xs:element name="highlights" type="sr:StringListType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Education Section -->
  <xs:complexType name="EducationType">
    <xs:sequence>
      <xs:element name="institution" type="xs:string" minOccurs="0"/>
      <xs:element name="school" type="xs:string" minOccurs="0"/>
      <xs:element name="url" type="xs:anyURI" minOccurs="0"/>
      <xs:element name="area" type="xs:string" minOccurs="0"/>
      <xs:element name="studyType" type="xs:string" minOccurs="0"/>
      <xs:element name="degree" type="xs:string" minOccurs="0"/>
      <xs:element name="description" type="xs:string" minOccurs="0"/>
      <xs:element name="startDate" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="endDate" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="score" type="xs:string" minOccurs="0"/>
      <xs:element name="gpa" type="xs:string" minOccurs="0"/>
      <xs:element name="location" type="xs:string" minOccurs="0"/>
      <xs:element name="country" type="sr:countryCodeType" minOccurs="0"/>
      <xs:element name="courses" type="sr:StringListType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Awards Section -->
  <xs:complexType name="AwardType">
    <xs:sequence>
      <xs:element name="title" type="xs:string" minOccurs="0"/>
      <xs:element name="date" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="awarder" type="xs:string" minOccurs="0"/>
      <xs:element name="summary" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Certificates Section -->
  <xs:complexType name="CertificateType">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="date" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="url" type="xs:anyURI" minOccurs="0"/>
      <xs:element name="issuer" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Publications Section -->
  <xs:complexType name="PublicationType">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="publisher" type="xs:string" minOccurs="0"/>
      <xs:element name="releaseDate" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="url" type="xs:anyURI" minOccurs="0"/>
      <xs:element name="summary" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Skills Section -->
  <xs:complexType name="SkillType">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="level" type="sr:proficiencyLevelType" minOccurs="0"/>
      <xs:element name="yearsOfExperience" type="xs:decimal" minOccurs="0"/>
      <xs:element name="comment" type="xs:string" minOccurs="0"/>
      <xs:element name="keywords" type="sr:StringListType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Tools Section -->
  <xs:complexType name="ToolType">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="group" type="xs:string" minOccurs="0"/>
      <xs:element name="category" type="xs:string" minOccurs="0"/>
      <xs:element name="yearsOfExperience" type="xs:decimal" minOccurs="0"/>
      <xs:element name="level" type="sr:proficiencyLevelType" minOccurs="0"/>
      <xs:element name="comment" type="xs:string" minOccurs="0"/>
      <xs:element name="url" type="xs:anyURI" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Languages Section -->
  <xs:complexType name="LanguageType">
    <xs:sequence>
      <xs:element name="language" type="xs:string" minOccurs="0"/>
      <xs:element name="fluency" type="sr:languageFluencyType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Interests Section -->
  <xs:complexType name="InterestType">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="keywords" type="sr:StringListType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- References Section -->
  <xs:complexType name="ReferenceType">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="reference" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Projects Section -->
  <xs:complexType name="ProjectType">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="description" type="xs:string" minOccurs="0"/>
      <xs:element name="highlights" type="sr:StringListType" minOccurs="0"/>
      <xs:element name="keywords" type="sr:StringListType" minOccurs="0"/>
      <xs:element name="startDate" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="endDate" type="sr:iso8601DateType" minOccurs="0"/>
      <xs:element name="url" type="xs:anyURI" minOccurs="0"/>
      <xs:element name="roles" type="sr:StringListType" minOccurs="0"/>
      <xs:element name="entity" type="xs:string" minOccurs="0"/>
      <xs:element name="type" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Meta Section -->
  <xs:complexType name="MetaType">
    <xs:sequence>
      <xs:element name="canonical" type="xs:anyURI" minOccurs="0"/>
      <xs:element name="version" type="xs:string" minOccurs="0"/>
      <xs:element name="lastModified" type="xs:dateTime" minOccurs="0"/>
      <xs:element name="dateCreated" type="xs:dateTime" minOccurs="0"/>
      <xs:element name="dateModified" type="xs:dateTime" minOccurs="0"/>
      <xs:element name="datePublished" type="xs:dateTime" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>
