// 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_ZIP_WRITER_H_
#define THIRD_PARTY_CREDENTIO_FORMATS_ZIP_WRITER_H_

#include "absl/base/attributes.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 ZIP-based assets.
class ZipWriter {
 public:
  // Creates a Zip writer.
  //
  // The generator must outlive the writer.
  explicit ZipWriter(const ManifestStoreGenerator* absl_nonnull generator
                         ABSL_ATTRIBUTE_LIFETIME_BOUND)
      : 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.
  //
  // `destination` must support read mode and random access (e.g.
  // `riegeli::StringWriter`, or `riegeli::CFileWriter` opened with
  // `set_read(true)`), because the embedded manifest store is finalized by
  // reading back and patching the written asset. Otherwise, returns
  // `InvalidArgumentError` without writing to `destination`.
  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_ZIP_WRITER_H_
