// 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_PNG_EMBEDDER_H_
#define THIRD_PARTY_CREDENTIO_FORMATS_PNG_EMBEDDER_H_

#include "absl/status/status.h"
#include "absl/strings/string_view.h"
#include "formats/png/hasher.h"
#include "riegeli/bytes/reader.h"
#include "riegeli/bytes/writer.h"

namespace credentio {

// A utility class for embedding a C2PA manifest store as a `caBX` chunk in a
// non-C2PA PNG file.
class PngEmbedder {
 public:
  PngEmbedder() = default;

  // Copies the PNG read from `reader` to `writer`, inserting `manifest_store`
  // as a `caBX` chunk at `digest_result.insertion_offset`, the offset
  // `DigestPng()` reserved for it: the start of the first `IDAT` chunk, or of
  // an already existing `caBX` chunk.
  //
  // An existing `caBX` chunk, whose size `digest_result` reports as
  // `existing_c2pa_length`, is replaced by the new one.
  //
  // NOTE: Input and output must be disjoint, i.e., in-place embedding is not
  // supported.
  absl::Status CopyAndEmbed(riegeli::Reader& reader,
                            absl::string_view manifest_store,
                            const DigestPngResult& digest_result,
                            riegeli::Writer& writer) const;
};

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_FORMATS_PNG_EMBEDDER_H_
