// 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_TESTING_JUMBF_UTILS_H_
#define THIRD_PARTY_CREDENTIO_TESTING_JUMBF_UTILS_H_

#include <cstdint>
#include <optional>
#include <string>

#include "absl/strings/string_view.h"
#include "absl/types/span.h"
#include "assertion/assertion_cbor_encoder.h"
#include "jumbf/box.h"
#include "proto/assertion.pb.h"

namespace credentio {

// Parses the given bytes as a JUMBF superbox. The underlying bytes must outlive
// the returned SuperBox.
jumbf::SuperBox ParseSuperBoxOrDie(const std::string* bytes);

// NOTE: Helpers below returning jumbf::SuperBox set `raw_bytes` to a fixed
// test value.

jumbf::SuperBox CreateManifestStore(
    absl::Span<const jumbf::SuperBox> manifests);
jumbf::SuperBox CreateStandardManifest(absl::string_view label,
                                       absl::Span<const jumbf::SuperBox> boxes);
jumbf::SuperBox CreateUpdateManifest(absl::string_view label,
                                     absl::Span<const jumbf::SuperBox> boxes);
jumbf::SuperBox CreateAssertionStoreBox();
jumbf::SuperBox CreateAssertionStoreBox(
    absl::Span<const jumbf::SuperBox> assertions);
jumbf::SuperBox CreateAssertionBoxFromCbor(absl::string_view label,
                                           absl::string_view cbor);
jumbf::SuperBox CreateAssertionBoxFromEmbeddedFile(
    absl::string_view label, absl::string_view media_type,
    absl::string_view file_contents,
    std::optional<absl::string_view> file_name = std::nullopt);
jumbf::SuperBox CreateActionsAssertionBoxFromCbor(absl::string_view cbor);
jumbf::SuperBox CreateBmffBasedHashAssertionBoxFromCbor(absl::string_view cbor);
jumbf::SuperBox CreateDataHashAssertionBoxFromCbor(absl::string_view cbor);
jumbf::SuperBox CreateAssertionBoxFromJson(absl::string_view label,
                                           absl::string_view json);

// Returns a serialized claim signature JUMBF box.
std::string EncodeClaimSignatureBox(absl::string_view cbor);

// Returns a serialized assertion JUMBF box.
std::string EncodeAssertionBoxOrDie(const Assertion& assertion,
                                    const AssertionCborEncoder& encoder);

// Returns the hash of the given box per
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_hashed_uris.
std::string GetHash(absl::string_view algorithm, const jumbf::SuperBox& box);

// This creates the start of a manifest store payload, just enough to pass
// MightBeC2paManifestStore(...).
std::string CreateStartOfManifestStorePayload(
    absl::Span<const uint8_t> prefix = {});

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_TESTING_JUMBF_UTILS_H_
