// 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.
//

#ifndef THIRD_PARTY_CREDENTIO_ASSERTION_PARSE_ASSERTION_H_
#define THIRD_PARTY_CREDENTIO_ASSERTION_PARSE_ASSERTION_H_

#include <optional>

#include "absl/status/status.h"
#include "absl/strings/string_view.h"
#include "google/protobuf/struct.pb.h"
#include "proto/actions_assertion.pb.h"
#include "proto/ai_disclosure_assertion.pb.h"
#include "proto/asset_reference_assertion.pb.h"
#include "proto/asset_types_assertion.pb.h"
#include "proto/bmff_based_hash_assertion.pb.h"
#include "proto/boxes_hash_assertion.pb.h"
#include "proto/collection_data_hash_assertion.pb.h"
#include "proto/data_hash_assertion.pb.h"
#include "proto/environmental_sustainability_assertion.pb.h"
#include "proto/ingredient_assertion.pb.h"
#include "proto/metadata_assertion.pb.h"
#include "proto/multi_asset_hash_assertion.pb.h"
#include "proto/repository_receipt_assertion.pb.h"
#include "proto/soft_binding_assertion.pb.h"
#include "proto/thumbnail_assertion.pb.h"

namespace credentio {

// Parses a CBOR-encoded `actions-map-v2`.
// See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_schema_and_example_8.
absl::Status ParseAssertion(absl::string_view assertion,
                            ActionsAssertion* proto);

// Parses a CBOR-encoded `actions-map-v1`.
absl::Status ParseAssertion(absl::string_view assertion,
                            ActionsAssertionV1* proto);

// Parses a CBOR-encoded `bmff-based-hash-map`.
// See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_bmff_based_hash.
absl::Status ParseAssertion(absl::string_view assertion,
                            BmffBasedHashAssertion* proto);

// Parses a CBOR-encoded `data-hash-map`.
// See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_data_hash.
absl::Status ParseAssertion(absl::string_view assertion,
                            DataHashAssertion* proto);

// Parses a CBOR-encoded `ingredient-map-v3`.
absl::Status ParseAssertion(absl::string_view assertion,
                            IngredientAssertionV3* proto);

// Parses a CBOR-encoded `asset-ref-map`.
// See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_asset_reference.
absl::Status ParseAssertion(absl::string_view assertion,
                            AssetReferenceAssertion* proto);

// Parses a CBOR-encoded `asset-type-map`.
// See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_asset_type.
absl::Status ParseAssertion(absl::string_view assertion,
                            AssetTypesAssertion* proto);

// Parses a CBOR-encoded `box-hash-map`.
// See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_general_box_hash.
absl::Status ParseAssertion(absl::string_view assertion,
                            BoxesHashAssertion* proto);

// Parses a CBOR-encoded `multi-asset-hash-map`.
// See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_multi_asset_hash.
absl::Status ParseAssertion(absl::string_view assertion,
                            MultiAssetHashAssertion* proto);

// Parses a CBOR-encoded `collection-data-hash-map`.
// See
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_collection_data_hash.
absl::Status ParseAssertion(absl::string_view assertion,
                            CollectionDataHashAssertion* proto);

absl::Status ParseAssertion(absl::string_view assertion,
                            AiDisclosureAssertion* proto);

absl::Status ParseAssertion(absl::string_view assertion,
                            EnvironmentalSustainabilityAssertion* proto);

absl::Status ParseAssertion(absl::string_view assertion,
                            RepositoryReceiptAssertion* proto);

absl::Status ParseAssertion(absl::string_view assertion,
                            SoftBindingAssertion* proto);

ThumbnailAssertion ParseThumbnailAssertion(
    absl::string_view media_type, absl::string_view data,
    std::optional<absl::string_view> file_name);

absl::Status ParseStruct(absl::string_view content,
                         google::protobuf::Struct* proto);

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_ASSERTION_PARSE_ASSERTION_H_
