// 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_TEST_BUILDER_H_
#define THIRD_PARTY_CREDENTIO_FORMATS_GIF_TEST_BUILDER_H_

#include <cstdint>
#include <optional>
#include <string>

namespace credentio {

class TestGifBuilder {
 public:
  // Adds a GIF header block.
  void AddGifHeader();

  // Adds a GIF logical descriptor block.
  void AddLogicalDescriptor(bool has_color_table);

  // Adds a GIF image descriptor block.
  void AddImageDescriptor(bool has_color_table);

  // Adds a generic block to the GIF.
  void AddBlock(uint8_t introducer, std::optional<uint8_t> type = std::nullopt,
                std::optional<std::string> info = std::nullopt,
                std::optional<std::string> data = std::nullopt);

  // Returns the built GIF.
  std::string GetAsset();

 private:
  std::string gif_data_;
};

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_FORMATS_GIF_TEST_BUILDER_H_
