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

#include "formats/gif/embedder.h"

#include <cstdint>
#include <optional>

#include "absl/status/status.h"
#include "absl/status/status_macros.h"
#include "absl/strings/string_view.h"
#include "formats/gif/block.h"
#include "riegeli/bytes/copy_all.h"
#include "riegeli/bytes/reader.h"
#include "riegeli/bytes/writer.h"

namespace credentio {

absl::Status GifEmbedder::CopyAndEmbed(
    riegeli::Reader& input, absl::string_view manifest_store,
    int64_t insert_at_offset, std::optional<int64_t> existing_c2pa_length,
    riegeli::Writer& output) const {
  if (!input.Copy(insert_at_offset, output)) {
    return input.StatusOrAnnotate(
        absl::InternalError("failed to copy input up to insert point"));
  }
  // Embed the manifest store.
  ABSL_RETURN_IF_ERROR(WriteGifC2paBlock(manifest_store, output));
  input.Skip(existing_c2pa_length.value_or(0));

  return riegeli::CopyAll(input, output);
}

}  // namespace credentio
