// 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/generator_info.proto";
import "proto/hashed_uri.proto";

// An assertion that provides information on edits and other actions taken that
// affect the asset’s content.
//
// See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_actions
// for more details.
message ActionsAssertion {
  // A list of actions on the asset.
  repeated ActionItem actions = 1
      [(cbor.tags) = { is_required: true, disallow_empty: true }];
  // A list of templates for the actions.
  // See template behavior in
  // https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_action_templates
  repeated ActionTemplate templates = 2;
  repeated GeneratorInfo software_agents = 4
      [(cbor.tags) = { name: "softwareAgents" }];

  // If true, indicates that all actions performed are included in an actions
  // assertion. This must be set to a value to be considered conformant.
  bool all_actions_included = 5 [(cbor.tags) = { name: "allActionsIncluded" }];
  reserved 3;
}

message ActionsAssertionV1 {
  // A list of actions on the asset.
  repeated ActionItemV1 actions = 1
      [(cbor.tags) = { is_required: true, disallow_empty: true }];
  reserved 2;
}

message ActionItem {
  string action = 1 [(cbor.tags) = { is_required: true }];
  string description = 2;
  string digital_source_type = 3 [(cbor.tags) = { name: "digitalSourceType" }];
  GeneratorInfo software_agent = 4 [(cbor.tags) = { name: "softwareAgent" }];
  int64 software_agent_index = 10
      [(cbor.tags) = { name: "softwareAgentIndex" }];
  // List of related actions.
  repeated ActionItem related_actions = 6 [(cbor.tags) = { name: "related" }];
  // The reason why this action was performed, required when the action is
  // `c2pa.redacted`
  string reason = 7;
  // Additional parameters of the action.
  ActionParameters parameters = 9;

  reserved 5, 8;
}

message ActionItemV1 {
  string action = 1 [(cbor.tags) = { is_required: true }];
  string digital_source_type = 2 [(cbor.tags) = { name: "digitalSourceType" }];
  // Additional parameters of the action.
  ActionParameters parameters = 3;
}

message ActionTemplate {
  string action = 1 [(cbor.tags) = { is_required: true }];
  string description = 2;
  string digital_source_type = 3 [(cbor.tags) = { name: "digitalSourceType" }];
  GeneratorInfo software_agent = 4 [(cbor.tags) = { name: "softwareAgent" }];
  // Either an internal URI (representing an icon embedded in the manifest
  // store) or an external URI.
  InternalOrExternalHashedUri icon = 5;
  // Additional parameters of the template.
  repeated ActionParameters.Data parameters = 6
      [(cbor.tags) = { name: "templateParameters" }];
}

// Parameters for actions.
//
// See `parameters-map-v2` in
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_schema_and_example_9
// for more details.
message ActionParameters {
  // UUID of the modified (output) resource.
  string instance_id = 1 [(cbor.tags) = { name: "instanceID" }];
  // JUMBF URI to the redacted assertion (required for `c2pa.redacted` action).
  string redacted_uri = 2 [(cbor.tags) = { name: "redacted" }];
  // List of JUMBF URIs to ingredient assertions.
  repeated HashedUri ingredients = 3;
  // For v1 action assertions. When parsing CBOR, the contents of this field
  // will be moved to the `ingredients` field, so it should always be empty.
  HashedUri ingredient = 7;
  // See `parameters-common-map-v2` in
  // https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_schema_and_example_9
  // for more details.
  message Data {
    string key = 1;
    bytes value = 2;
  }
  // A list of arbitrary string-to-value data.
  repeated Data data = 4;
  // BCP-47 code of the source language of a `c2pa.translated` action.
  string source_language = 5 [(cbor.tags) = { name: "sourceLanguage" }];
  // BCP-47 code of the target language of a `c2pa.translated` action.
  string target_language = 6 [(cbor.tags) = { name: "targetLanguage" }];
  // Was this action performed multiple times?
  bool multiple_instances = 8 [(cbor.tags) = { name: "multipleInstances" }];
  // JUMBF URIs to related assertions.
  repeated HashedUri related_assertions = 9
      [(cbor.tags) = { name: "relatedAssertions", disallow_empty: true }];
}
