Skip to content
use actix_web::Result as AwResult;
use actix_web::{HttpRequest, get, web};

use super::render_layout;
use super::session_auth::get_username_from_request;
use crate::auth::NotesContext;

fn wrap_auth_content(content: &maud::Markup) -> maud::Markup {
    maud::html! {
        div id="auth-content" class="flex flex-column items-center justify-center" style="min-height: calc(100vh - 12rem); padding: 2rem 1rem;" {
            div class="w-100 mw6" {
                (content)
            }
        }
    }
}

#[get("/auth/login")]
pub async fn login_page(
    req: HttpRequest,
    auth_state: web::Data<NotesContext>,
) -> AwResult<maud::Markup> {
    let username = get_username_from_request(&req, &auth_state).await;
    let content = maud::html! {
        div class="bg-white pa4 shadow-4 ba b--black-10" {
            h1 class="f3 fw6 mb4 tc brand" { "Sign In to Later Notes" }

            form
                hx-post="/auth/login"
                hx-target="#login-result"
                hx-target-error="#login-result"
                hx-swap="innerHTML"
            {
                div class="mb3" {
                    label class="db f6 fw6 black-70 mb2" for="username" { "Username" }
                    input
                        type="text"
                        name="username"
                        id="username"
                        required
                        class="db w-100 pa3 ba b--black-20 f5"
                        placeholder="Enter your username";
                }

                div class="mb4" {
                    label class="db f6 fw6 black-70 mb2" for="password" { "Password" }
                    input
                        type="password"
                        name="password"
                        id="password"
                        required
                        class="db w-100 pa3 ba b--black-20 f5"
                        placeholder="Enter your password";
                }

                button
                    type="submit"
                    class="w-100 pa3 btn-brand f5 fw6 cursor-pointer"
                {
                    "Login"
                }
            }

            div id="login-result" class="mt3" {}
        }
    };

    if req.headers().get("HX-Request").is_some() {
        Ok(content)
    } else {
        Ok(render_layout(
            &wrap_auth_content(&content),
            username.as_deref(),
        ))
    }
}

pub fn render_login_success(username: &str) -> maud::Markup {
    maud::html! {
        div class="ba b--green pa3 bg-washed-green" {
            h2 class="f4 fw6 mb3 dark-green" { "Login successful!" }
            p class="f6 dark-green mb2" {
                "Welcome, " (username) "!"
            }
            p class="f6 dark-green mb3" {
                "Redirecting to dashboard..."
            }
        }
    }
}