// 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.
  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_
