Skip to content
use maud::{Markup, html};

pub fn guard_view(error: Option<&str>) -> Markup {
    html! {
        div class="hero min-h-screen" {
            div class="hero-content w-full justify-center p-4" {
                div class="card card-border w-full max-w-sm bg-base-200" {
                    div class="card-body p-6 items-center text-center" {
                        h1 class="card-title text-2xl font-bold justify-center text-center mb-2" {
                            "Notify"
                        }
                        p class="text-sm opacity-70 mb-4" {
                            "Enter the 6-digit PIN to access notifications"
                        }

                        @if let Some(err) = error {
                            div id="status" class="w-full mb-3" {
                                div role="alert" class="alert alert-error flex items-center" {
                                    span { (err) }
                                }
                            }
                        } @else {
                            div id="status" class="w-full" {}
                        }

                        form hx-post="/pin" hx-target="#main" hx-swap="innerHTML" class="flex flex-col items-center gap-4 w-full" {
                            label class="otp" {
                                span {}
                                span {}
                                span {}
                                span {}
                                span {}
                                span {}
                                input type="text"
                                      name="pin"
                                      autocomplete="one-time-code"
                                      inputmode="numeric"
                                      maxlength="6"
                                      pattern="[0-9]{6}"
                                      required
                                      autofocus
                                      oninput="if(this.value.length === 6) this.form.requestSubmit();";
                            }

                            button type="submit" class="btn btn-primary btn-lg btn-block" {
                                "Unlock"
                            }
                        }
                    }
                }
            }
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_guard_view_contains_otp_component() {
        let html_str = guard_view(None).into_string();
        assert!(html_str.contains("class=\"otp\""));
        assert!(html_str.contains("maxlength=\"6\""));
        assert!(html_str.contains("pattern=\"[0-9]{6}\""));
        assert!(html_str.contains(
            "<span></span><span></span><span></span><span></span><span></span><span></span>"
        ));
        assert!(html_str.contains("hx-post=\"/pin\""));
    }

    #[test]
    fn test_guard_view_with_error() {
        let html_str = guard_view(Some("Invalid PIN")).into_string();
        assert!(html_str.contains("alert-error"));
        assert!(html_str.contains("Invalid PIN"));
    }
}