/*
 * Copyright 2026 Rive
 */

#include "rive/decoders/texture_decoder.hpp"

#include <cstdio>

#ifdef RIVE_ASTC_DECODER
std::unique_ptr<Bitmap> decode_astc_texture(
    const uint8_t* blocks,
    size_t byteCount,
    uint32_t width,
    uint32_t height,
    uint32_t blockWidth,
    uint32_t blockHeight);
#endif

#ifdef RIVE_BC_DECODER
std::unique_ptr<Bitmap> decode_bc_texture(
    const uint8_t* blocks,
    size_t byteCount,
    uint32_t width,
    uint32_t height,
    rive::GPUTextureFormat format);
#endif

#ifdef RIVE_ETC_DECODER
std::unique_ptr<Bitmap> decode_etc_texture(
    const uint8_t* blocks,
    size_t byteCount,
    uint32_t width,
    uint32_t height,
    rive::GPUTextureFormat format);
#endif

// Body branches reference these params via #ifdef; mark as maybe-unused so
// no-decoder-compiled-in builds don't warn.
std::unique_ptr<Bitmap> decode_texture(
    [[maybe_unused]] const uint8_t* blocks,
    [[maybe_unused]] size_t byteCount,
    [[maybe_unused]] uint32_t width,
    [[maybe_unused]] uint32_t height,
    rive::GPUTextureFormat format,
    [[maybe_unused]] uint32_t blockWidth,
    [[maybe_unused]] uint32_t blockHeight)
{

  switch (format)
  {
    case rive::GPUTextureFormat::astc:
#ifdef RIVE_ASTC_DECODER
      return decode_astc_texture(
          blocks,
          byteCount,
          width,
          height,
          blockWidth,
          blockHeight);
#else
      fprintf(
          stderr,
          "ASTC texture not supported "
          "(build with --with_rive_astc_decoder)\n");
      return nullptr;
#endif

    case rive::GPUTextureFormat::bc1:
    case rive::GPUTextureFormat::bc2:
    case rive::GPUTextureFormat::bc3:
    case rive::GPUTextureFormat::bc7:
#ifdef RIVE_BC_DECODER
      return decode_bc_texture(blocks, byteCount, width, height, format);
#else
      fprintf(
          stderr,
          "BC texture not supported "
          "(build with --with_rive_bc_decoder)\n");
      return nullptr;
#endif

    case rive::GPUTextureFormat::etc2:
#ifdef RIVE_ETC_DECODER
      return decode_etc_texture(blocks, byteCount, width, height, format);
#else
      fprintf(
          stderr,
          "ETC texture not supported "
          "(build with --with_rive_etc_decoder)\n");
      return nullptr;
#endif

    default:
      fprintf(
          stderr,
          "decode_texture - unsupported format %u\n",
          static_cast<unsigned>(format));
      return nullptr;
  }
}
