// 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_TIFF_EXTRACTOR_H_
#define THIRD_PARTY_CREDENTIO_FORMATS_TIFF_EXTRACTOR_H_

#include <optional>
#include <string>
#include <vector>

#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "formats/asset_box.h"
#include "formats/byte_range.h"
#include "formats/extractor.h"
#include "riegeli/bytes/reader.h"

namespace credentio {

// Implements the C2PA Manifest Store extractor for TIFF files as described in
// https://spec.c2pa.org/specifications/specifications/2.4/specs/C2PA_Specification.html#_embedding_manifests_into_tiff_based_assets
class TiffExtractor : public FormatExtractor {
 public:
  TiffExtractor() = default;
  ~TiffExtractor() override = default;

  absl::StatusOr<std::string> ExtractManifestStore(
      riegeli::Reader& input) const override;

  // Given the heavy reliance on exact offsets built into this format, we can
  // only support extraction methods that operate on the entire file (options:
  // {.end_offset = -1}).
  absl::StatusOr<std::optional<ByteRange>> ExtractManifestStoreLocation(
      riegeli::Reader& input, ExtractOptions options) const override;

  // Given the heavy reliance on exact offsets built into this format, we can
  // only support extraction methods that operate on the entire file (options:
  // {.end_offset = -1}).
  absl::StatusOr<std::vector<AssetBox>> ExtractBoxes(
      riegeli::Reader& input, ExtractOptions options) const override {
    return absl::UnimplementedError(
        "Extracting boxes is not supported for TIFF files.");
  }

  bool MightBeC2paManifestStore(absl::string_view payload) const override;
};

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_FORMATS_TIFF_EXTRACTOR_H_
