// 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_GIF_WRITER_H_
#define THIRD_PARTY_CREDENTIO_FORMATS_GIF_WRITER_H_

#include "absl/base/nullability.h"
#include "absl/functional/any_invocable.h"
#include "absl/status/status.h"
#include "async/async_context.h"
#include "generator/generator.h"
#include "proto/generator.pb.h"
#include "riegeli/bytes/reader.h"
#include "riegeli/bytes/writer.h"

namespace credentio {

// Writes C2PA manifest stores into GIF images.
class GifWriter {
 public:
  // Information about the C2PA manifest store embedded in the output asset.
  struct OutputMetadata {
    // Whether the C2PA active manifest embedded in the output asset has a
    // timestamp.
    bool timestamp_included = false;
  };

  // Creates a GIF writer.
  //
  // The generator must outlive the writer.
  explicit GifWriter(const ManifestStoreGenerator* absl_nonnull 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 and no `opened` action is present.
  void Write(GenerateManifestStoreRequest request,
             riegeli::Reader* absl_nonnull source,
             riegeli::Writer* absl_nonnull destination,
             OutputMetadata* absl_nullable output_metadata,
             AsyncContext context,
             absl::AnyInvocable<void(absl::Status) &&> cb) const;
  // Blocking version.
  absl::Status Write(
      GenerateManifestStoreRequest request,
      riegeli::Reader* absl_nonnull source,
      riegeli::Writer* absl_nonnull destination,
      OutputMetadata* absl_nullable output_metadata = nullptr) const;

 private:
  const ManifestStoreGenerator& generator_;
};

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_FORMATS_GIF_WRITER_H_
