import gleam/int
import gleam/javascript/promise.{type Promise}
import gleam/io
import lustre
import lustre/attribute
import lustre/element.{type Element}
import lustre/element/html
import lustre/event

pub fn main() {
  let app = lustre.simple(init, update, view)
  let assert Ok(dispatch) = lustre.start(app, "#app", Nil)

  dispatch
}

type Model =
  Int

fn init(_) -> Model {
  0
}

pub type Msg {
  Increment
  Decrement
  Greet
}

fn update(model: Model, msg: Msg) -> Model {
  case msg {
    Increment -> model + 1
    Decrement -> model - 1
    Greet -> {
      {
        use greeting <- promise.await(greet("Gleam"))
        case greeting {
          Ok(g) -> io.print(g)
          Error(e) -> io.print("greeting err: " <> e)
        }
        promise.resolve(#())
      }
      model
    }
  }
}

@external(javascript, "./ffi/commands.js", "greet")
pub fn greet(name: String) -> Promise(Result(String, String))

fn view(model: Model) -> Element(Msg) {
  let count = int.to_string(model)

  html.div([], [
    html.h1([], [element.text("Gleam + Vite + Tauri")]),
    html.p([attribute.style([#("text-align", "center")])], [
      element.text("Gleam counter " <> count <> " ✨"),
    ]),
    html.p([attribute.style([#("text-align", "center")])], [
      html.button([event.on_click(Decrement)], [element.text("-")]),
      html.button([event.on_click(Increment)], [element.text("+")]),
      html.button([event.on_click(Greet)], [element.text("Greet")]),
    ]),
  ])
}