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::HodisContext;

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 - 8rem); padding: 2rem 1rem;" {
            div class="w-100 mw6" {
                (content)
            }
        }
    }
}

#[get("/auth/signup")]
pub async fn signup_page(
    req: HttpRequest,
    auth_state: web::Data<HodisContext>,
) -> AwResult<maud::Markup> {
    let username = get_username_from_request(&req, &auth_state).await;
    let invite_code = req.query_string();
    let invite_param = if invite_code.starts_with("code=") {
        invite_code.strip_prefix("code=").unwrap_or("").to_string()
    } else {
        String::new()
    };

    let content = maud::html! {
        h1 class="f3 fw6 mb4 tc" style="color: #e3001a;" { "Konto erstellen" }

        @if invite_param.is_empty() {
            div class="ba br2 pa4 mb4" style="background-color: #fef7f7; border-color: #e3001a;" {
                p class="f6 black-70 mb2" {
                    "Du benötigst einen Einladungslink, um ein Konto zu erstellen. Bitte jemanden mit einem Konto, einen mit dir zu teilen."
                }
            }
        } @else {
            div class="ba br2 pa4 mb4" style="background-color: #f0f8f0; border-color: #4caf50;" {
                p class="f6 black-70 mb2" {
                    "Erstelle dein Konto, um an der Challenge teilzunehmen."
                }
            }

            form
                hx-post="/auth/signup"
                hx-target="#signup-result"
                hx-target-error="#signup-result"
                hx-swap="innerHTML"
                class="ba b--black-20 br2 pa4 bg-white"
            {
                input type="hidden" name="invite_code" id="invite_code" value=(invite_param);

                div class="mb3" {
                    label class="db f6 black-70 mb2" for="username" { "Benutzername" }
                    input
                        type="text"
                        name="username"
                        id="username"
                        required
                        minlength="3"
                        class="db w-100 pa2 ba b--black-30 br1"
                        placeholder="Wähle einen Benutzernamen (mind. 3 Zeichen)";
                }

                div class="mb3" {
                    label class="db f6 black-70 mb2" for="email" { "E-Mail" }
                    input
                        type="email"
                        name="email"
                        id="email"
                        required
                        class="db w-100 pa2 ba b--black-30 br1"
                        placeholder="Gib deine E-Mail-Adresse ein";
                }

                div class="mb4" {
                    label class="db f6 black-70 mb2" for="password" { "Passwort" }
                    input
                        type="password"
                        name="password"
                        id="password"
                        required
                        minlength="8"
                        class="db w-100 pa2 ba b--black-30 br1"
                        placeholder="Wähle ein Passwort (mind. 8 Zeichen)";
                }

                button
                    type="submit"
                    class="w-100 pa2 btn-brand br1 f5 fw6"
                {
                    "Konto erstellen"
                }
            }

            div id="signup-result" class="mt3" {}

            div class="mt3 tc" {
                span class="black-60 f6" { "Bereits ein Konto? " }
                a href="/auth/login" class="brand no-underline f6 underline" {
                    "Anmelden"
                }
            }
        }
    };

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

#[get("/auth/login")]
pub async fn login_page(
    req: HttpRequest,
    auth_state: web::Data<HodisContext>,
) -> AwResult<maud::Markup> {
    let username = get_username_from_request(&req, &auth_state).await;
    let content = maud::html! {
            h1 class="f3 fw6 mb4 tc" style="color: #e3001a;" { "Anmelden" }

            form
                hx-post="/auth/login"
                hx-target="#login-result"
                hx-target-error="#login-result"
                hx-swap="innerHTML"
                class="ba b--black-20 br2 pa4 bg-white"
            {
                div class="mb3" {
    label class="db f6 black-70 mb2" for="username" { "Benutzername" }
                        input
                            type="text"
                            name="username"
                            id="username"
                            required
                            class="db w-100 pa2 ba b--black-30 br1"
                            placeholder="Gib deinen Benutzernamen ein";
                }

                div class="mb4" {
    label class="db f6 black-70 mb2" for="password" { "Passwort" }
                        input
                            type="password"
                            name="password"
                            id="password"
                            required
                            class="db w-100 pa2 ba b--black-30 br1"
                            placeholder="Gib dein Passwort ein";
                }

    button
                        type="submit"
                        class="w-100 pa2 btn-brand br1 f5 fw6"
                {
                    "Anmelden"
                }
            }

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

            div class="mt3 tc" {
                span class="black-60 f6" { "Noch kein Konto? " }
                a href="/auth/signup" class="brand no-underline f6 underline" {
                    "Registrieren"
                }
            }
        };

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

pub fn render_signup_success(username: &str) -> maud::Markup {
    maud::html! {
        div class="ba b--green br2 pa3 bg-washed-green" {
            h2 class="f4 fw6 mb3 dark-green" { "Konto erstellt!" }
            p class="f6 dark-green mb2" {
                "Willkommen, " (username) "! Dein Konto wurde erfolgreich erstellt."
            }
            div class="flex flex-column" {
                a
                    href="/auth/login"
                    class="db tc pa2 btn-brand br1 no-underline mb2"
                {
                    "Anmelden"
                }
            }
        }
    }
}

pub fn render_login_success(username: &str) -> maud::Markup {
    maud::html! {
        div class="ba b--green br2 pa3 bg-washed-green" {
            h2 class="f4 fw6 mb3 dark-green" { "Anmeldung erfolgreich!" }
            p class="f6 dark-green mb2" {
                "Willkommen zurück, " (username) "!"
            }
            p class="f6 dark-green mb3" {
                "Weiterleitung zum Dashboard..."
            }
        }
    }
}