// 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_FORMATS_GIF_HASHER_H_
#define THIRD_PARTY_CREDENTIO_FORMATS_GIF_HASHER_H_

#include <cstdint>
#include <optional>

#include "absl/status/statusor.h"
#include "crypto/algorithms.h"
#include "proto/data_hash_assertion.pb.h"
#include "riegeli/bytes/reader.h"

namespace credentio {

// Insertion point for a C2PA manifest store into a GIF image. The offset is
// relative to the start of the GIF image.
struct GifInsertionPoint {
  int64_t offset;

  bool operator==(const GifInsertionPoint& other) const = default;
};

struct DigestGifResult {
  DataHashAssertion data_hash;
  GifInsertionPoint insertion_point;
  std::optional<int64_t> existing_c2pa_length;
};

// Digests the given GIF image and returns a DigestGifResult that can be
// used to generate a C2PA manifest store. The manifest store will be placed
// before the first Graphic Control Extension or Image Descriptor.
absl::StatusOr<DigestGifResult> DigestGif(riegeli::Reader& input,
                                          HashAlgorithm alg);
}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_FORMATS_GIF_HASHER_H_
