<?xml version="1.0" encoding="UTF-8"?>
<!--
  Schema XML para el documento de atestación eArchiving v1.
  Namespace: https://docs.docuten.com/earchiving/attestation/v1
  Decisiones: D-07 (namespace propio), D-08 (signatureValidation), D-09 (submitter),
              D-10 (regulatoryBasis eIDAS Art. 45j(1)(b))
  Re-congelado 2026-10-30 (Phase 06.5, decisiones D-10/D-11 de esa fase): sipHash pasa a opcional,
              filename pasa a ser el nombre de origen del productor y se añade packagePath
              (opcional) con la ruta dentro del paquete. Re-congelado EN SITIO: cero instancias
              reales selladas contra un QTSP, ver 06.5-D11-MEDICION.md.
  Bindings JAXB: attestation-v1.xjb → paquete com.docuten.earchiving.attestation.internal.generated
-->
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:att="https://docs.docuten.com/earchiving/attestation/v1"
    targetNamespace="https://docs.docuten.com/earchiving/attestation/v1"
    elementFormDefault="qualified"
    version="1.0">

  <!--
    Elemento raíz: att:attestation
    Contiene todos los metadatos de atestación de un AIP (un SIP → AIP transform).
  -->
  <xs:element name="attestation" type="att:AttestationType"/>

  <xs:complexType name="AttestationType">
    <xs:sequence>
      <!-- Identificador del SIP de origen -->
      <xs:element name="sipId" type="xs:string"/>
      <!-- Identificador del AIP generado -->
      <xs:element name="aipId" type="xs:string"/>
      <!-- Identificador del tenant (multi-tenant) -->
      <xs:element name="tenantId" type="xs:string"/>
      <!-- Identificador del submitter: JWT sub claim o CN/SAN del cert mTLS (D-09) -->
      <xs:element name="submitter" type="xs:string"/>
      <!-- Timestamp de submisión en UTC -->
      <xs:element name="submittedAt" type="xs:dateTime"/>
      <!--
        SHA-256 hex byte a byte del SIP recibido; solo lo lleva POST /api/v1/ingest/sip;
        ausente en /file, donde lo recibido queda atestiguado fichero a fichero (Phase 06.5, D-10).
        Nada que no sea un hash real se emite con este nombre.
      -->
      <xs:element name="sipHash" type="xs:string" minOccurs="0"/>
      <!--
        Merkle root SHA-256 hex del AIP conservado (fixity del paquete completo tal como
        queda en custodia). Calculado en el paso 7 de la saga (MerkleTree.rootHash()) e
        incrustado por AttestationXmlBuilder ANTES de la C14N, de modo que queda cubierto
        por la firma QTSP (XAdES-BASELINE-LTA) y el sello TSA RFC 3161.

        Mientras sipHash acredita la autenticidad de ORIGEN (qué se recibió), aipMerkleRoot
        ancla la INTEGRIDAD del objeto archivado a un instante cualificado.

        Extensión ADITIVA (D-21, Phase 05.1, INTEG-03): minOccurs="0" para que los documentos
        de atestación emitidos antes de esta fase sigan validando contra este mismo esquema.
        No se crea attestation-v2.xsd ni se negocia versión.
      -->
      <xs:element name="aipMerkleRoot" type="xs:string" minOccurs="0"/>
      <!-- Base legal del archivado (D-10: eIDAS Art. 45j(1)(b), Reg. UE 2025/2532) -->
      <xs:element name="regulatoryBasis" type="att:RegulatoryBasisType"/>
      <!-- Lista de documentos incluidos en el AIP -->
      <xs:element name="documents" type="att:DocumentsType"/>
      <!--
        Hash SHA-256 del XML canonicalizado (C14N 1.1) — rellenado por AttestationXmlBuilder.
        Opcional en el schema (lo rellena el builder antes de sellar).
      -->
      <xs:element name="attestationHash" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!--
    att:RegulatoryBasisType: base legal del archivado electrónico.
    Atributos requeridos: legalAct (e.g. "eIDAS Art. 45j(1)(b)") y article (e.g. "Reg. UE 2025/2532").
    Decisión D-10.
  -->
  <xs:complexType name="RegulatoryBasisType">
    <xs:attribute name="legalAct" type="xs:string" use="required"/>
    <xs:attribute name="article" type="xs:string" use="required"/>
  </xs:complexType>

  <!--
    att:DocumentsType: contenedor de 1..N documentos del AIP.
  -->
  <xs:complexType name="DocumentsType">
    <xs:sequence>
      <xs:element name="document" type="att:DocumentType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <!--
    att:DocumentType: metadatos de un documento individual del AIP.
    - filename: nombre de origen del productor (el que declaró el cliente)
    - packagePath: ruta del fichero dentro del paquete, SIN aipId (opcional)
    - sha256Hash: hash SHA-256 hex del contenido del fichero
    - pronomId: identificador de formato PRONOM (e.g. "fmt/14" para PDF 1.0)
    - signatureValidation: resultado de la validación DSS de la firma (opcional) (D-08)
  -->
  <xs:complexType name="DocumentType">
    <xs:sequence>
      <xs:element name="filename" type="xs:string"/>
      <!--
        Ruta del fichero dentro del paquete AIP, sin el aipId (DI-05.2-12, Opción B).
        Regla de reconstrucción: la clave del fichero dentro del AIP es
        aipId + "/" + packagePath. Opcional: las atestaciones anteriores a Phase 06.5
        llevaban la ruta completa en filename y no incluyen este elemento.
        Debe ir inmediatamente después de filename (orden de la secuencia).
      -->
      <xs:element name="packagePath" type="xs:string" minOccurs="0"/>
      <xs:element name="sha256Hash" type="xs:string"/>
      <!--
        Identificador de formato PRONOM (National Archives UK).
        Formato: "fmt/N" o "x-fmt/N".
        Ejemplo: "fmt/14" = PDF 1.0, "fmt/276" = PDF/A-1b.
      -->
      <xs:element name="pronomId" type="xs:string"/>
      <!--
        Resultado de la validación de firma DSS (opcional).
        Solo presente si el documento tiene firma electrónica.
        Decisión D-08: resumen estructurado por documento.
      -->
      <xs:element name="signatureValidation" type="att:SignatureValidationType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!--
    att:SignatureValidationType: resultado de la validación DSS de la firma de un documento.
    Decisión D-08.
    Atributos:
    - indication: resultado ETSI — TOTAL_PASSED, TOTAL_FAILED, INDETERMINATE
    - signatureFormat: formato de firma DSS — e.g. "XAdES-BASELINE-LTA", "PAdES-BASELINE-T"
  -->
  <xs:complexType name="SignatureValidationType">
    <xs:attribute name="indication" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="TOTAL_PASSED"/>
          <xs:enumeration value="TOTAL_FAILED"/>
          <xs:enumeration value="INDETERMINATE"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="signatureFormat" type="xs:string" use="required"/>
  </xs:complexType>

</xs:schema>
