// 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_PDF_WRITER_H_
#define THIRD_PARTY_CREDENTIO_FORMATS_PDF_WRITER_H_

#include "absl/base/nullability.h"
#include "absl/log/die_if_null.h"
#include "absl/status/status.h"
#include "generator/generator.h"
#include "proto/generator.pb.h"
#include "riegeli/bytes/reader.h"
#include "riegeli/bytes/writer.h"

namespace credentio {

// Writer of C2PA manifest stores into PDF assets.
class PdfWriter {
 public:
  // Creates a PDF writer.
  //
  // The generator must outlive the writer.
  explicit PdfWriter(const ManifestStoreGenerator* absl_nonnull generator)
      : generator_(*ABSL_DIE_IF_NULL(generator)) {}

  // Generates a C2PA manifest store and embeds it into a copy of the given
  // asset. The riegeli::Reader and riegeli::Writer cannot be pointed to the
  // same underlying data. The request must not include `hard_binding`.

  // Fails if C2PA metadata already exists.
  absl::Status Write(GenerateManifestStoreRequest request,
                     riegeli::Reader* absl_nonnull source,
                     riegeli::Writer* absl_nonnull destination);

 private:
  const ManifestStoreGenerator& generator_;
};
}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_FORMATS_PDF_WRITER_H_
