use crate::{prelude::*, state::State as AppState, static_files};
use axum::{extract::State, response::Html, routing::get, Router};
use minijinja::context;
use tower_livereload::LiveReloadLayer;

pub async fn router() -> Result<Router> {
    let state = AppState::try_new().await?;

    let lr = LiveReloadLayer::new();
    let _template_file_watcher = state
        .clone()
        .templates
        .start_watcher(Some(lr.reloader()))
        .await?;
    let (static_file_service, _static_file_watcher) = static_files::router(Some(lr.reloader()))?;

    Ok(Router::new()
        .route("/", get(index))
        .nest_service("/static", static_file_service)
        .layer(lr)
        .with_state(state))
}

async fn index(State(state): State<AppState>) -> Result<Html<String>> {
    Ok(Html(
        state
            .templates
            .render("pages/index.html.jinja", context!())
            .await?,
    ))
}