<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="https://cdn.aytict.fi/xmlns/xsd"
            xmlns:dc="http://purl.org/dc/elements/1.1/"
            xmlns:xmlsig="http://www.w3.org/2000/09/xmldsig#"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            targetNamespace="https://cdn.aytict.fi/xmlns/note"
            elementFormDefault="qualified"
            version="3.0">
  <xsd:annotation>
    <xsd:documentation xml:lang="en">Schema for a multilingual note element. Enhanced for cdn.aytict.fi. Now with versioning, metadata, extensibility, localization, security, and audit logging.</xsd:documentation>
    <xsd:documentation xml:lang="fi">Skeema monikieliselle note-elementille. Parannettu cdn.aytict.fi:lle. Sisältää versionhallinnan, metatiedot, laajennettavuuden, lokalisoinnin, tietoturvan ja auditoinnin.</xsd:documentation>
    <xsd:appinfo>
      <versionLog>
        <version number="1.0" date="2026-04-01">Initial version</version>
        <version number="2.0" date="2026-04-04">Enhanced: cdn.aytict.fi namespace, multilingual docs, enumeration, extension point</version>
        <version number="3.0" date="2026-04-05">Major: Added metadata, constraints, audit, security, references, localization, and extension points</version>
      </versionLog>
      <author>aytict.fi</author>
      <license>MIT</license>
    </xsd:appinfo>
  </xsd:annotation>

  <!-- Main note element -->
  <xsd:element name="note">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="to" type="xsd:string"/>
        <xsd:element name="from" type="xsd:string"/>
        <xsd:element name="heading" type="localizedString"/>
        <xsd:element name="body" type="localizedString"/>
        <xsd:element name="priority" type="priorityType" minOccurs="0"/>
        <xsd:element name="status" type="statusType" minOccurs="0"/>
        <xsd:element name="created" type="xsd:dateTime"/>
        <xsd:element name="updated" type="xsd:dateTime" minOccurs="0"/>
        <xsd:element name="metadata" type="metadataType" minOccurs="0"/>
        <xsd:element name="auditLog" type="auditLogType" minOccurs="0"/>
        <xsd:element name="signature" type="xmlsig:SignatureType" minOccurs="0"/>
        <!-- Extension point: custom element -->
        <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
      </xsd:sequence>
      <xsd:attribute name="id" type="xsd:ID" use="required"/>
      <xsd:attribute name="lang" type="xsd:language" use="optional"/>
      <xsd:attribute name="version" type="xsd:string" use="optional"/>
    </xsd:complexType>
  </xsd:element>

  <!-- Localized string type -->
  <xsd:complexType name="localizedString">
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:attribute name="lang" type="xsd:language" use="optional"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>

  <!-- Priority enumeration -->
  <xsd:simpleType name="priorityType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="low"/>
      <xsd:enumeration value="normal"/>
      <xsd:enumeration value="high"/>
    </xsd:restriction>
  </xsd:simpleType>

  <!-- Status enumeration -->
  <xsd:simpleType name="statusType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="draft"/>
      <xsd:enumeration value="published"/>
      <xsd:enumeration value="archived"/>
    </xsd:restriction>
  </xsd:simpleType>

  <!-- Metadata type (Dublin Core example) -->
  <xsd:complexType name="metadataType">
    <xsd:sequence>
      <xsd:element name="title" type="xsd:string" minOccurs="0"/>
      <xsd:element name="creator" type="xsd:string" minOccurs="0"/>
      <xsd:element name="subject" type="xsd:string" minOccurs="0"/>
      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
      <xsd:element name="publisher" type="xsd:string" minOccurs="0"/>
      <xsd:element name="contributor" type="xsd:string" minOccurs="0"/>
      <xsd:element name="date" type="xsd:dateTime" minOccurs="0"/>
      <xsd:element name="type" type="xsd:string" minOccurs="0"/>
      <xsd:element name="format" type="xsd:string" minOccurs="0"/>
      <xsd:element name="identifier" type="xsd:string" minOccurs="0"/>
      <xsd:element name="source" type="xsd:string" minOccurs="0"/>
      <xsd:element name="language" type="xsd:language" minOccurs="0"/>
      <xsd:element name="relation" type="xsd:string" minOccurs="0"/>
      <xsd:element name="coverage" type="xsd:string" minOccurs="0"/>
      <xsd:element name="rights" type="xsd:string" minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>

  <!-- Audit log type -->
  <xsd:complexType name="auditLogType">
    <xsd:sequence>
      <xsd:element name="event" minOccurs="0" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="timestamp" type="xsd:dateTime"/>
            <xsd:element name="user" type="xsd:string"/>
            <xsd:element name="action" type="xsd:string"/>
            <xsd:element name="details" type="xsd:string" minOccurs="0"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>

  <!-- Reference type for relationships -->
  <xsd:complexType name="referenceType">
    <xsd:attribute name="ref" type="xsd:IDREF" use="required"/>
    <xsd:attribute name="type" type="xsd:string" use="optional"/>
  </xsd:complexType>

</xsd:schema>
