// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

edition = "2024";

package credentio;

import "cbor/tags.proto";
import "proto/asset_type.proto";
import "proto/hashed_uri.proto";
import "proto/validation_status.proto";

// Represents an assertion about an ingredient used in the asset.
// Based on `ingredient-map-v2` in
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#ingredient_schema.
message IngredientAssertionV2 {
  // The name of the ingredient.
  string title = 1 [(cbor.tags) = { is_required: true, name: "dc:title" }];
  // The media type of the ingredient.
  string media_type = 2
      [(cbor.tags) = { is_required: true, name: "dc:format" }];
  // The relationship of this ingredient to the asset it is an ingredient of.
  string relationship = 3;
  // The value of the ingredient's `xmpMM:DocumentID`.
  string document_id = 4 [(cbor.tags) = { name: "documentID" }];
  // Unique identifier, such as the value of the ingredient's
  // `xmpMM:InstanceID`.
  string instance_id = 5 [(cbor.tags) = { name: "instanceID" }];
  // URI reference to a data box or external data containing the ingredient
  // asset itself.
  InternalOrExternalHashedUri data = 6;
  // Additional information about the data's type.
  repeated AssetType data_types = 7;
  // URI reference to the C2PA Manifest of the ingredient.
  HashedUri c2pa_manifest = 8;
  // URI reference to a thumbnail in a data box.
  HashedUri thumbnail = 9;
  // Validation status of the ingredient (provided by the claim generator).
  repeated ValidationStatus validation_status = 14
      [(cbor.tags) = { name: "validationStatus" }];
  // Additional description of the ingredient.
  string description = 11;
  // URI to an informational page about the ingredient or its data.
  string informational_uri = 12 [(cbor.tags) = { name: "informational_URI" }];
  reserved 13;

  reserved 10;
}

// Represents an assertion about an ingredient used in the asset.
// Based on `ingredient-map` in
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#ingredient_schema.
message IngredientAssertionV1 {
  // The name of the ingredient.
  string title = 1 [(cbor.tags) = { is_required: true, name: "dc:title" }];
  // The media type of the ingredient.
  string media_type = 2
      [(cbor.tags) = { is_required: true, name: "dc:format" }];
  // The value of the ingredient's `xmpMM:DocumentID`.
  string document_id = 3 [(cbor.tags) = { name: "documentID" }];
  // Unique identifier, such as the value of the ingredient's
  // `xmpMM:InstanceID`.
  string instance_id = 4
      [(cbor.tags) = { is_required: true, name: "instanceID" }];
  // The relationship of this ingredient to the asset it is an ingredient of.
  string relationship = 5;
  // URI reference to the C2PA Manifest of the ingredient.
  HashedUri c2pa_manifest = 6;
  // URI reference to a thumbnail in a data box.
  HashedUri thumbnail = 7;
  // Validation status of the ingredient (provided by the claim generator).
  repeated ValidationStatus validation_status = 10
      [(cbor.tags) = { name: "validationStatus" }];
  reserved 9;

  reserved 8;
}

// Represents an assertion about an ingredient used in the asset.
// Based on `ingredient-map-v3` in
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#ingredient_schema.
message IngredientAssertionV3 {
  string title = 1 [(cbor.tags) = { name: "dc:title" }];
  string media_type = 2 [(cbor.tags) = { name: "dc:format" }];
  string relationship = 3;
  IngredientValidationResults validation_results = 4
      [(cbor.tags) = { name: "validationResults" }];
  string instance_id = 5 [(cbor.tags) = { name: "instanceID" }];
  InternalOrExternalHashedUri data = 6;
  repeated AssetType data_types = 7 [(cbor.tags) = { name: "dataTypes" }];
  HashedUri active_manifest = 8 [(cbor.tags) = { name: "activeManifest" }];
  HashedUri claim_signature = 9 [(cbor.tags) = { name: "claimSignature" }];
  HashedUri thumbnail = 10;
  string description = 11;
  string informational_uri = 12 [(cbor.tags) = { name: "informationalURI" }];
  string digital_source_type = 14 [(cbor.tags) = { name: "digitalSourceType" }];
  reserved 13;
}

// Changes/deltas between the current and previous validation results for each
// ingredient's manifest.
// See `ingredient-delta-validation-result-map` at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_returning_validation_results.
message IngredientDeltaValidationResult {
  string ingredient_assertion_uri = 1
      [(cbor.tags) = { name: "ingredientAssertionURI", is_required: true }];
  ValidationStatusSet validation_deltas = 2
      [(cbor.tags) = { name: "validationDeltas", is_required: true }];
}

// Results from the claim generator performing full validation.
// See `validation-results-map` at
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_returning_validation_results.
message IngredientValidationResults {
  ValidationStatusSet active_manifest = 1
      [(cbor.tags) = { name: "activeManifest" }];
  repeated IngredientDeltaValidationResult ingredient_deltas = 2
      [(cbor.tags) = { name: "ingredientDeltas" }];
  string spec_version = 6 [(cbor.tags) = { name: "specVersion" }];
  string trust_list_uri = 7 [(cbor.tags) = { name: "trustListUri" }];
  reserved 3, 4, 5;
}
