// 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_BMFF_EXTRACTOR_H_
#define THIRD_PARTY_CREDENTIO_FORMATS_BMFF_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_byte_info.h"
#include "formats/extractor.h"
#include "riegeli/bytes/reader.h"

namespace credentio {

// Extracts C2PA Manifest Store from an ISO BMFF based file (e.g., mp4).
class BmffExtractor : public FormatExtractor {
 public:
  BmffExtractor() = default;
  ~BmffExtractor() override = default;

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

  absl::StatusOr<std::optional<ByteRange>> ExtractManifestStoreLocation(
      riegeli::Reader& input, ExtractOptions options) const override;

  // BMFF does not have a concept of boxes, so this always returns an error.
  absl::StatusOr<std::vector<AssetBox>> ExtractBoxes(
      riegeli::Reader& input, ExtractOptions options) const override {
    return absl::UnimplementedError("BMFF does not have a concept of boxes");
  }

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

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_FORMATS_BMFF_EXTRACTOR_H_
