<?xml version="1.0" encoding="UTF-8"?>
<!--
  Schema XML del documento de atestación de hash del AIP COMPLETO ("sello #2") v1.
  Namespace: https://docs.docuten.com/earchiving/aip-hash-attestation/v1
  Decisión: D-26 (Phase 05.1) — sello en dos fases.

  QUÉ CERTIFICA ESTE DOCUMENTO

  El fixity del AIP tal como queda en custodia DESPUÉS del merge del paso 10 de la saga,
  SIN EXCLUSIONES: contenido + METS.xml + premis.xml + los ficheros de
  metadata/preservation/ generados por la propia atestación de origen.

  QUÉ *NO* ES

  NO es la atestación de origen (origin-attestation.xml, attestation-v1.xsd, sello #1):
  aquélla acredita la autenticidad de ORIGEN del SIP y, por construcción, no puede cubrir
  los ficheros de atestación que ella misma genera (circularidad detectada por B-1).
  NO es el informe de verificación on-demand (integrity-report-v1.xsd, Plan 05.1-10).
  Los tres son artefactos sellados INDEPENDIENTES con propósitos distintos: este esquema
  no importa, no extiende y no comparte ObjectFactory con ninguno de ellos, y por tanto no
  arrastra campos ajenos (submitter, sipHash, sipId, submittedAt, documents,
  regulatoryBasis) a un documento que solo habla de integridad del objeto conservado.

  DÓNDE SE PUEBLA EL CONTENIDO

  fullAipMerkleRoot y la lista completa de fileEntry se pueblan en el objeto JAXB ANTES de
  marshalToBytes()/canonicalize() (AipHashAttestationXmlBuilder). Poblarlos después dejaría
  la evidencia FUERA de lo firmado por el QTSP y sellado por la TSA — exactamente el defecto
  que D-21 corrigió para aipMerkleRoot en el sello #1.

  Bindings JAXB: aip-hash-attestation-v1.xjb
                 → paquete com.docuten.earchiving.attestation.internal.generated.aiphash
-->
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:ah="https://docs.docuten.com/earchiving/aip-hash-attestation/v1"
    targetNamespace="https://docs.docuten.com/earchiving/aip-hash-attestation/v1"
    elementFormDefault="qualified"
    version="1.0">

  <!-- Elemento raíz: ah:aipHashAttestation -->
  <xs:element name="aipHashAttestation" type="ah:AipHashAttestationType"/>

  <xs:complexType name="AipHashAttestationType">
    <xs:sequence>
      <!-- Identificador del AIP cuyo fixity completo se certifica -->
      <xs:element name="aipId" type="xs:string"/>
      <!-- Identificador del tenant (multi-tenant) -->
      <xs:element name="tenantId" type="xs:string"/>
      <!-- Identificador/ruta del blob WORM definitivo del AIP sobre el que se calculó el root -->
      <xs:element name="aipBlobId" type="xs:string"/>
      <!--
        Merkle root SHA-256 hex del AIP COMPLETO, calculado sobre el blob WORM definitivo
        sin ninguna exclusión (D-26). Es la referencia contra la que INTEG-06 contrasta la
        recomputación del AIP entero.
      -->
      <xs:element name="fullAipMerkleRoot" type="xs:string"/>
      <!-- Instante UTC en que se calculó el root y se solicitó el sello -->
      <xs:element name="sealedAt" type="xs:dateTime"/>
      <!--
        Fixity por fichero del AIP completo: una entrada por CADA fichero del paquete.
        Una vez sellada, esta lista es la ÚNICA referencia que permite diagnosticar QUÉ
        fichero cambió ante un FAIL de sello #2, sin depender de aip_files (que solo refleja
        el estado pre-merge del paso 7).
      -->
      <xs:element name="fileEntry" type="ah:FileEntryType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <!--
    ah:FileEntryType: fixity de un fichero individual del AIP.
    - filename:   RUTA COMPLETA del fichero dentro del ZIP del AIP (nunca nombre base:
                  dos representaciones pueden contener ficheros homónimos con contenido
                  distinto — Assumption A4, Plan 05.1-01)
    - sha256Hash: hash SHA-256 hex REAL de ese fichero (nunca un valor colectivo compartido)
  -->
  <xs:complexType name="FileEntryType">
    <xs:sequence>
      <xs:element name="filename" type="xs:string"/>
      <xs:element name="sha256Hash" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>
