/*
 * Copyright 2025 Rive
 */

// GM test for Ore cubemap textures. Renders a unique solid color to each of
// the 6 cube faces, then samples the cubemap with a shader that maps UV to
// a cube direction. The output shows a 3x2 grid of the 6 face colors.
// Verifies: TextureType::cube, per-face TextureView rendering,
// cube texture sampling, and TextureViewDimension::cube.

#include "gm.hpp"
#include "gmutils.hpp"
#include "ore_gm_helper.hpp"

#if defined(ORE_BACKEND_METAL) || defined(ORE_BACKEND_D3D11) ||                \
    defined(ORE_BACKEND_D3D12) || defined(ORE_BACKEND_GL) ||                   \
    defined(ORE_BACKEND_WGPU) || defined(ORE_BACKEND_VK) ||                    \
    defined(ORE_BACKEND_RHI)
#include "rive/renderer/render_canvas.hpp"

#include "rive/renderer/ore/ore_bind_group.hpp"
#include "rive/renderer/ore/ore_buffer.hpp"
#include "rive/renderer/ore/ore_texture.hpp"
#include "rive/renderer/ore/ore_sampler.hpp"
#include "rive/renderer/ore/ore_shader_module.hpp"
#include "rive/renderer/ore/ore_pipeline.hpp"
#include "rive/renderer/ore/ore_render_pass.hpp"
#endif

using namespace rivegm;
using namespace rive;
using namespace rive::gpu;
#if defined(ORE_BACKEND_METAL) || defined(ORE_BACKEND_D3D11) ||                \
    defined(ORE_BACKEND_D3D12) || defined(ORE_BACKEND_GL) ||                   \
    defined(ORE_BACKEND_WGPU) || defined(ORE_BACKEND_VK) ||                    \
    defined(ORE_BACKEND_RHI)
using namespace rive::ore;
#endif

// Colors for each cube face: +X red, -X cyan, +Y green, -Y magenta,
// +Z blue, -Z yellow.

#if defined(ORE_BACKEND_METAL) || defined(ORE_BACKEND_D3D11) ||                \
    defined(ORE_BACKEND_D3D12) || defined(ORE_BACKEND_GL) ||                   \
    defined(ORE_BACKEND_WGPU) || defined(ORE_BACKEND_VK) ||                    \
    defined(ORE_BACKEND_RHI)
static const float kFaceColors[6][4] = {
    {1, 0, 0, 1}, // +X: red
    {0, 1, 1, 1}, // -X: cyan
    {0, 1, 0, 1}, // +Y: green
    {1, 0, 1, 1}, // -Y: magenta
    {0, 0, 1, 1}, // +Z: blue
    {1, 1, 0, 1}, // -Z: yellow
};
#endif

class OreCubemapGM : public GM
{
public:
  // 3x2 grid of faces, each 64x64 = 192x128 total.
  OreCubemapGM() : GM(192, 128) {}

  ColorInt clearColor() const override { return 0xff000000; }

  void onDraw(rive::Renderer* originalRenderer) override
  {
    auto renderContext = TestingWindow::Get()->renderContext();
    if (!renderContext || !m_ore.ensureContext(renderContext))
      return;

#if defined(ORE_BACKEND_METAL) || defined(ORE_BACKEND_D3D11) ||                \
    defined(ORE_BACKEND_D3D12) || defined(ORE_BACKEND_GL) ||                   \
    defined(ORE_BACKEND_WGPU) || defined(ORE_BACKEND_VK) ||                    \
    defined(ORE_BACKEND_RHI)
    auto& ctx = *renderContext->getOreContext();
    constexpr uint32_t kFaceSize = 64;

    // Create cubemap texture.
    TextureDesc cubeTexDesc{};
    cubeTexDesc.width = kFaceSize;
    cubeTexDesc.height = kFaceSize;
    cubeTexDesc.depthOrArrayLayers = 6;
    cubeTexDesc.format = TextureFormat::rgba8unorm;
    cubeTexDesc.type = TextureType::cube;
    cubeTexDesc.renderTarget = true;
    cubeTexDesc.label = "cubemap";
    auto cubeTex = ctx.makeTexture(cubeTexDesc);

    // Create per-face 2D views for rendering to each face.
    rcp<TextureView> faceViews[6];
    for (int i = 0; i < 6; ++i)
    {
      TextureViewDesc tvd{};
      tvd.texture = cubeTex.get();
      tvd.dimension = TextureViewDimension::texture2D;
      tvd.baseLayer = i;
      tvd.layerCount = 1;
      faceViews[i] = ctx.makeTextureView(tvd);
    }

    // Create a cube view for sampling all 6 faces.
    TextureViewDesc cubeViewDesc{};
    cubeViewDesc.texture = cubeTex.get();
    cubeViewDesc.dimension = TextureViewDimension::cube;
    cubeViewDesc.layerCount = 6;
    auto cubeView = ctx.makeTextureView(cubeViewDesc);

    // Fill each cube face with a unique color using clear.
    m_ore.beginFrame(renderContext);

    for (int i = 0; i < 6; ++i)
    {
      RenderPassDesc rpDesc{};
      rpDesc.colorAttachments[0].view = faceViews[i].get();
      rpDesc.colorAttachments[0].loadOp = LoadOp::clear;
      rpDesc.colorAttachments[0].storeOp = StoreOp::store;
      rpDesc.colorAttachments[0].clearColor = {
          kFaceColors[i][0],
          kFaceColors[i][1],
          kFaceColors[i][2],
          kFaceColors[i][3]};
      rpDesc.colorCount = 1;
      rpDesc.label = "cube_face_pass";

      auto pass = ctx.beginRenderPass(rpDesc);
      pass->finish();
    }

    // Now sample the cubemap and render a 3x2 grid showing all faces.
    // Load shader from the pre-compiled RSTB.
    auto shader = ore_gm::loadShader(ctx, ore_gm::kCubemap);
    if (!shader.vsModule)
      return;

    auto cubeLayout1 = ore_gm::makeLayoutFromShader(
        ctx,
        shader.vsModule.get(),
        1);
    auto cubeLayout2 = ore_gm::makeLayoutFromShader(
        ctx,
        shader.vsModule.get(),
        2);
    BindGroupLayout* cubeLayouts[] = {
        nullptr,
        cubeLayout1.get(),
        cubeLayout2.get()};

    PipelineDesc cubeSamplePipeDesc{};
    cubeSamplePipeDesc.vertexModule = shader.vsModule.get();
    cubeSamplePipeDesc.fragmentModule = shader.psModule.get();
    cubeSamplePipeDesc.vertexEntryPoint = shader.vsEntryPoint;
    cubeSamplePipeDesc.fragmentEntryPoint = shader.fsEntryPoint;
    cubeSamplePipeDesc.vertexBufferCount = 0;
    cubeSamplePipeDesc.topology = PrimitiveTopology::triangleList;
    cubeSamplePipeDesc.colorTargets[0].format = TextureFormat::rgba8unorm;
    cubeSamplePipeDesc.colorCount = 1;
    cubeSamplePipeDesc.depthStencil.depthCompare = CompareFunction::always;
    cubeSamplePipeDesc.depthStencil.depthWriteEnabled = false;
    cubeSamplePipeDesc.bindGroupLayouts = cubeLayouts;
    cubeSamplePipeDesc.bindGroupLayoutCount = 3;
    cubeSamplePipeDesc.label = "cube_sample_pipeline";
    auto cubeSamplePipeline = ctx.makePipeline(cubeSamplePipeDesc);

    SamplerDesc sampDesc{};
    sampDesc.minFilter = Filter::nearest;
    sampDesc.magFilter = Filter::nearest;
    sampDesc.label = "cube_sampler";
    auto sampler = ctx.makeSampler(sampDesc);

    // Render to canvas.
    auto canvas = renderContext->makeRenderCanvas(192, 128);
    if (!canvas)
      return;
    auto canvasView = ctx.wrapCanvasTexture(canvas.get());

    RenderPassDesc samplePassDesc{};
    samplePassDesc.colorAttachments[0].view = canvasView.get();
    samplePassDesc.colorAttachments[0].loadOp = LoadOp::clear;
    samplePassDesc.colorAttachments[0].storeOp = StoreOp::store;
    samplePassDesc.colorAttachments[0].clearColor = {0, 0, 0, 1};
    samplePassDesc.colorCount = 1;
    samplePassDesc.label = "cube_sample_pass";

    // Create bind groups for the texture (group 1) and sampler (group 2).
    BindGroupDesc::TexEntry texEntry{0, cubeView.get()};
    BindGroupDesc texBGDesc{};
    texBGDesc.layout = cubeLayout1.get();
    texBGDesc.textures = &texEntry;
    texBGDesc.textureCount = 1;
    auto texBG = ctx.makeBindGroup(texBGDesc);

    BindGroupDesc::SampEntry sampEntry{0, sampler.get()};
    BindGroupDesc sampBGDesc{};
    sampBGDesc.layout = cubeLayout2.get();
    sampBGDesc.samplers = &sampEntry;
    sampBGDesc.samplerCount = 1;
    auto sampBG = ctx.makeBindGroup(sampBGDesc);

    auto samplePass = ctx.beginRenderPass(samplePassDesc);
    samplePass->setPipeline(cubeSamplePipeline.get());
    samplePass->setBindGroup(1, texBG.get());
    samplePass->setBindGroup(2, sampBG.get());
    samplePass->setViewport(0, 0, 192, 128);
    samplePass->draw(3);
    samplePass->finish();

    m_ore.endFrame(renderContext);
    ore_gm::invalidateGLStateAfterOre(renderContext);

    // Composite the canvas into the main framebuffer via the original
    // renderer. No frame break needed — Ore rendered to a separate canvas
    // texture, not the main render target.
    originalRenderer->save();
    originalRenderer->drawImage(
        canvas->renderImage(),
        {.filter = ImageFilter::nearest},
        BlendMode::srcOver,
        1);
    originalRenderer->restore();
#endif
  }

private:
  ore_gm::OreGMContext m_ore;
};

GMREGISTER(ore_cubemap, return new OreCubemapGM())
