// 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/block.h"

#include <algorithm>
#include <cstdint>

#include "absl/status/status.h"
#include "absl/strings/string_view.h"
#include "formats/gif/constants.h"
#include "riegeli/bytes/writer.h"
#include "riegeli/endian/endian_writing.h"

namespace credentio {

namespace {

absl::Status WriteDataAsBlocks(absl::string_view payload,
                               riegeli::Writer& output) {
  for (int64_t start = 0; start < payload.size(); start += 255) {
    int64_t block_size = std::min<int64_t>(255, payload.size() - start);

    if (!output.WriteByte(block_size)) {
      return output.status();
    }
    if (!output.Write(payload.substr(start, block_size))) {
      return output.status();
    }
  }

  if (!output.WriteByte(0)) {
    return output.status();
  }

  return absl::OkStatus();
}

}  // namespace

// Given the size of a jumbf payload in bytes, it will return the total number
// of bytes required to store the payload within a GIF block where the data is
// segmented into blocks of at most 255 bytes.
uint64_t CalculateTotalGifC2paBlockSize(uint64_t jumbf_payload_size) {
  // The C2PA block is:
  // - 1 byte for the extension introducer (0x21)
  // - 1 byte for the extension type (0xFF)
  // - 1 byte for the informational data (always 0x0B)
  // - 11 bytes for the c2pa informational data
  // - ceil(jumbf_payload_size / 255) + jumbf_payload_size bytes for the data
  // - 1 byte for the termination block (0x00)
  return 15 + jumbf_payload_size + (jumbf_payload_size + 254) / 255;
}

// Writes the given payload as a GIF block with n blocks of at most 255 bytes
// each.
absl::Status WriteGifC2paBlock(absl::string_view payload,
                               riegeli::Writer& output) {
  if (!output.WriteByte(kGifExtensionIntroducer)) {
    return output.status();
  }
  if (!output.WriteByte(kGifExtensionApplication)) {
    return output.status();
  }
  if (!output.WriteByte(kGifC2paExtensionInfoSize)) {
    return output.status();
  }
  if (!output.Write(kGifC2paIdentifier)) {
    return output.status();
  }
  if (!riegeli::WriteBigEndian<uint16_t>(kGifC2paAuthenticationCode, output)) {
    return output.status();
  }
  if (!output.WriteByte(0)) {
    return output.status();
  }
  return WriteDataAsBlocks(payload, output);
}

}  // namespace credentio
