use hui::{
  color, size,
  signal::Signal,
  draw::TextureFormat,
  layout::{Alignment, Direction},
  element::{
    container::Container,
    text::Text,
    image::Image,
    br::Break,
    interactable::ElementInteractableExt,
    UiElementExt,
  },
};

#[derive(Signal)]
enum CounterSignal {
  Increment,
  Decrement,
}

#[path = "../boilerplate.rs"]
#[macro_use]
mod boilerplate;

const IMAGE_DATA: &[u8] = include_bytes!("../assets/icons/visual-studio-code-icon_32x32.rgba");

ui_main!(
  "hUI: Internal input test",
  init: |ui| {
    let image = ui.add_image(TextureFormat::Rgba, IMAGE_DATA, 32);
    (0, image)
  },
  run: |ui, size, (ref mut counter, image)| {
    Container::default()
      .with_size(size!(100%))
      .with_padding(10.)
      .with_align((Alignment::Center, Alignment::Begin))
      .with_direction(Direction::Horizontal)
      .with_gap(5.)
      .with_background((0.1, 0.1, 0.1))
      .with_wrap(true)
      .with_children(|ui| {
        Text::new("Number of images:")
          .with_text_size(24)
          .add_child(ui);
        Break.add_child(ui);
        Container::default()
          .with_padding(10.)
          .with_background(color::ORANGE)
          .with_children(|ui| {
            Text::new("-")
              .with_text_size(32)
              .add_child(ui);
          })
          .on_click(|| CounterSignal::Decrement)
          .add_child(ui);
        Container::default()
          .with_size(size!(60, auto))
          .with_align(Alignment::Center)
          .with_children(|ui| {
            Text::new(counter.to_string())
              .with_text_size(64)
              .add_child(ui);
          })
          .add_child(ui);
        Container::default()
          .with_padding(10.)
          .with_background(color::ORANGE)
          .with_children(|ui| {
            Text::new("+")
              .with_text_size(32)
              .add_child(ui);
          })
          .on_click(|| CounterSignal::Increment)
          .add_child(ui);
        Break.add_child(ui);
        for _ in 0..*counter {
          Image::new(*image)
            .with_size(size!(48, 48))
            .add_child(ui);
        }
      })
      .add_root(ui, size);

    ui.process_signals(|sig| match sig {
      CounterSignal::Increment => *counter += 1,
      CounterSignal::Decrement => *counter -= 1,
    });
  }
);