#![cfg_attr(target_family = "wasm", no_main)]
//! Renders a div with deep children hierarchy. This example is useful to exemplify that Zed can
//! handle deep hierarchies (even though it cannot just yet!).
use std::sync::LazyLock;

use gpui::{App, Bounds, Context, Window, WindowBounds, WindowOptions, div, prelude::*, px, size};
use gpui_platform::application;

struct Tree {}

static DEPTH: LazyLock<u64> = LazyLock::new(|| {
    std::env::var("GPUI_TREE_DEPTH")
        .ok()
        .and_then(|depth| depth.parse().ok())
        .unwrap_or_else(|| 50)
});

impl Render for Tree {
    fn render(&mut self, _: &mut Window, _: &mut Context<Self>) -> impl IntoElement {
        let mut depth = *DEPTH;
        static COLORS: [gpui::Hsla; 4] = [gpui::red(), gpui::blue(), gpui::green(), gpui::yellow()];
        let mut colors = COLORS.iter().cycle().copied();
        let mut next_div = || div().p_0p5().bg(colors.next().unwrap());
        let mut innermost_node = next_div();
        while depth > 0 {
            innermost_node = next_div().child(innermost_node);
            depth -= 1;
        }
        innermost_node
    }
}

fn run_example() {
    application().run(|cx: &mut App| {
        let bounds = Bounds::centered(None, size(px(300.0), px(300.0)), cx);
        cx.open_window(
            WindowOptions {
                window_bounds: Some(WindowBounds::Windowed(bounds)),
                ..Default::default()
            },
            |_, cx| cx.new(|_| Tree {}),
        )
        .unwrap();
    });
}

#[cfg(not(target_family = "wasm"))]
fn main() {
    run_example();
}

#[cfg(target_family = "wasm")]
#[wasm_bindgen::prelude::wasm_bindgen(start)]
pub fn start() {
    gpui_platform::web_init();
    run_example();
}
