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

    <!-- Root element for a prompt -->
    <xs:element name="prompt">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="metadata" minOccurs="0"/>
                <xs:element ref="title" minOccurs="0"/>
                <xs:element ref="role" minOccurs="0"/>
                <xs:element ref="tone" minOccurs="0"/>
                <xs:element ref="context" minOccurs="0"/>
                <xs:element ref="goal"/>
                <xs:element ref="constraints" minOccurs="0"/>
                <xs:element ref="instructions" minOccurs="0"/><!-- TODO: To be deprecated in the next releases (29/10/2025) -->
                <xs:element ref="steps" minOccurs="0" />
                <xs:element ref="examples" minOccurs="0"/>
                <xs:element ref="output-format" minOccurs="0"/>
                <xs:element ref="safeguards" minOccurs="0"/>
                <xs:element ref="acceptance-criteria" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="title" type="xs:string"/>

    <!-- Metadata section (equivalent to frontmatter) -->
    <xs:element name="metadata">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="author" minOccurs="0"/>
                <xs:element ref="version" minOccurs="0"/>
                <xs:element ref="title" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="author" type="xs:string"/>
    <xs:element name="version" type="xs:string"/>

    <!-- Context information -->
    <xs:element name="context" type="xs:string"/>

    <!-- System role -->
    <xs:element name="role" type="xs:string"/>

    <!-- Tone specification -->
    <xs:element name="tone" type="xs:string"/>

    <!-- Goal statement -->
    <xs:element name="goal">
        <xs:complexType mixed="true">
            <xs:sequence>
                <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- Instructions section -->
    <xs:element name="instructions">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="steps"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- Steps container -->
    <xs:element name="steps">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="step" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- Individual step -->
    <xs:element name="step">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="step-title"/>
                <xs:element ref="step-content"/>
                <xs:element ref="step-constraints" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute name="number" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="step-title" type="xs:string"/>
    <xs:element name="step-content">
        <xs:complexType mixed="true">
            <xs:sequence>
                <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- Step constraints -->
    <xs:element name="step-constraints">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="step-constraint-list"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="step-constraint-list">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="step-constraint" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="step-constraint" type="xs:string"/>

    <!-- Constraints block -->
    <xs:element name="constraints">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="constraints-description" minOccurs="0"/>
                <xs:element ref="constraint-list"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="constraints-description" type="xs:string"/>

    <xs:element name="constraint-list">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="constraint" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="constraint" type="xs:string"/>

    <!-- Examples container -->
    <xs:element name="examples">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="toc" minOccurs="0"/>
                <xs:element ref="example" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <!-- Table of contents (auto-generated) -->
    <xs:element name="toc">
        <xs:complexType>
            <xs:attribute name="auto-generate" use="optional" default="true">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="true"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="source" type="xs:string" use="optional" default="rule-sections"/>
            <xs:attribute name="include-subtitles" use="optional" default="false">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="true"/>
                        <xs:enumeration value="false"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <!-- Example section -->
    <xs:element name="example">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="example-header"/>
                <xs:element ref="example-description" minOccurs="0"/>
                <xs:element ref="code-examples" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute name="type" type="xs:string" use="optional"/>
            <xs:attribute name="number" type="xs:string" use="optional"/>
            <xs:attribute name="id" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="example-header">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="example-title"/>
                <xs:element ref="example-subtitle" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="example-title" type="xs:string"/>
    <xs:element name="example-subtitle" type="xs:string"/>
    <xs:element name="example-description" type="xs:string"/>

    <!-- Code examples with good and bad patterns -->
    <xs:element name="code-examples">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="good-example" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="bad-example" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="good-example">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="code-block"/>
            </xs:sequence>
            <xs:attribute name="last-item" type="xs:boolean" use="optional" default="false"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="bad-example">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="code-block"/>
            </xs:sequence>
            <xs:attribute name="last-item" type="xs:boolean" use="optional" default="false"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="code-block">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="language" type="xs:string" use="optional"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <!-- Output format section -->
    <xs:element name="output-format">
        <xs:complexType mixed="true">
            <xs:sequence>
                <xs:element ref="output-format-list" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="output-format-list">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="output-format-item" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="output-format-item" type="xs:string"/>

    <!-- Safeguards section -->
    <xs:element name="safeguards">
        <xs:complexType mixed="true">
            <xs:sequence>
                <xs:element ref="safeguards-list" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="safeguards-list">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="safeguards-item" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="safeguards-item" type="xs:string"/>

    <!-- Acceptance criteria section -->
    <xs:element name="acceptance-criteria">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="acceptance-criteria-list"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="acceptance-criteria-list">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="acceptance-criteria-item" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="acceptance-criteria-item" type="xs:string"/>

</xs:schema>
