use nightshade::prelude::*;

pub fn configure_editor_render_graph(
    graph: &mut RenderGraph<World>,
    device: &wgpu::Device,
    surface_format: wgpu::TextureFormat,
    resources: RenderResources,
) {
    let bloom_width = resources.surface_width / 2;
    let bloom_height = resources.surface_height / 2;

    let bloom_texture = graph
        .add_color_texture("bloom")
        .format(wgpu::TextureFormat::Rgba16Float)
        .size(bloom_width, bloom_height)
        .clear_color(wgpu::Color::BLACK)
        .transient();

    let dof_texture = graph
        .add_color_texture("dof_output")
        .format(wgpu::TextureFormat::Rgba16Float)
        .size(resources.surface_width, resources.surface_height)
        .clear_color(wgpu::Color::BLACK)
        .transient();

    let bloom_pass =
        passes::BloomPass::new(device, resources.surface_width, resources.surface_height);
    graph
        .pass(Box::new(bloom_pass))
        .read("hdr", resources.scene_color)
        .write("bloom", bloom_texture);

    let dof_pass = passes::DepthOfFieldPass::new(
        device,
        wgpu::TextureFormat::Rgba16Float,
        resources.surface_width,
        resources.surface_height,
    );
    graph
        .pass(Box::new(dof_pass))
        .read("hdr", resources.scene_color)
        .read("depth", resources.depth)
        .write("dof_output", dof_texture);

    let ssao_pass = passes::SsaoPass::new(device);
    graph
        .pass(Box::new(ssao_pass))
        .read("depth", resources.depth)
        .read("view_normals", resources.view_normals)
        .write("ssao_raw", resources.ssao_raw);

    let ssao_blur_pass = passes::SsaoBlurPass::new(device);
    graph
        .pass(Box::new(ssao_blur_pass))
        .read("ssao_raw", resources.ssao_raw)
        .read("depth", resources.depth)
        .read("view_normals", resources.view_normals)
        .write("ssao", resources.ssao);

    let postprocess_pass = passes::PostProcessPass::new(device, surface_format, 0.3);
    graph
        .pass(Box::new(postprocess_pass))
        .read("hdr", dof_texture)
        .read("bloom", bloom_texture)
        .read("ssao", resources.ssao)
        .write("output", resources.compute_output);

    let swapchain_blit_pass =
        passes::BlitPass::new(device, surface_format).with_name("swapchain_blit_pass");
    graph
        .pass(Box::new(swapchain_blit_pass))
        .read("input", resources.compute_output)
        .write("output", resources.swapchain);
}
