Documentation
#![cfg(feature = "examples")]
use crate::components::button::button::{Button, ButtonBuild};
use crate::components::container::container::ContainerBuild;
use crate::components::form::components::text::{InputBuild, InputText, LabelBuild};
use crate::components::form::form::{Form, FormBuild};
use crate::components::icons::{icon::Icon, icons::IconBuild};
use crate::components::toast::toast::{toast, ToastBodyBuild, ToastBuild, ToastPosition};
use darth_rust::DarthRust;
use leptos::*;

#[derive(DarthRust, Debug)]
pub struct Form {
    #[pattern(r"^.{3,32}$")]
    #[pattern_notify("user must be valid")]
    user: String,
    #[pattern(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$")]
    #[pattern_notify("e-mail must be valid")]
    email: String,
    #[pattern(r"^.{6,32}$")]
    #[pattern_notify("password must be valid")]
    password: String,
}

#[component]
pub fn RegisterForm() -> impl IntoView {
    view! {
        <Form props=FormBuild::new()
           .class("")
            .submit(|hashmap, _| {
                let user = hashmap.get("user").expect("Input name user not found");
                let email = hashmap.get("email").expect("Input name email not found");
                let password = hashmap.get("password").expect("Input name password not found");
                let form = Form::new()
                    .user(user)
                    .email(email)
                    .password(password)
                    .build();
                if let Ok(form) = form {
                    let body_content = format!(
                        "(200, user: {}, email: {}, password: {})",
                        form.user, form.email, form.password
                    );
                    toast(ToastBuild::new()
                        .class("bg-green-500")
                        .position(ToastPosition::TopEnd)
                        .duration_seconds(3)
                        .body(
                            ToastBodyBuild::new()
                            .class("p-2")
                            .content(body_content)
                            .tag("p")
                        )
                    );
                } else if let Err(content) = form {
                    toast(ToastBuild::new()
                        .class("bg-indigo-600")
                        .position(ToastPosition::TopMid)
                        .duration_seconds(10)
                        .body(
                            ToastBodyBuild::new()
                            .class("p-2 font-bold")
                            .content(content)
                        )
                        .unique(true)
                    );
                }
        })>
            <InputText props=InputBuild::new()
                .label(LabelBuild::new()
                    .name("User")
                    .forhtml("User")
                )
                .icon(IconBuild::new()
                    .class("text-white")
                    .icon(Icon::User)
                    .size::<usize>(24)
                )
                .input_box(ContainerBuild::new()
                    .class("box_ghost hover:border-indigo-400")
                )
                .container(ContainerBuild::new()
                    .class("p-2")
                )
                .class("input focus:bg-indigo-950")
                .placeholder("Your user")
                .name("user")
            />
            <InputText props=InputBuild::new()
                .label(LabelBuild::new()
                    .name("Email")
                    .forhtml("Email")
                )
                .icon(IconBuild::new()
                    .class("text-white")
                    .icon(Icon::Email)
                    .size::<usize>(24)
                )
                .input_box(ContainerBuild::new()
                    .class("box_ghost border-white hover:border-indigo-400")
                )
                .container(ContainerBuild::new()
                    .class("p-2")
                )
                .class("input focus:bg-indigo-950")
                .placeholder("Your best email")
                .name("email")
            />
            <InputText props=InputBuild::new()
                .label(LabelBuild::new()
                    .name("password")
                    .forhtml("Password")
                )
                .icon(IconBuild::new()
                    .class("text-white")
                    .icon(Icon::Key)
                    .size::<usize>(24)
                )
                .input_box(ContainerBuild::new()
                    .class("box_ghost hover:border-indigo-400")
                )
                .container(ContainerBuild::new()
                    .class("p-2")
                )
                .class("input focus:bg-indigo-950")
                .placeholder("Your password")
                .name("password")
            />
            <Button props=ButtonBuild::new()
                .class("button_sunset w-full")
                .kind("submit")
            >
                "Register"
            </Button>
        </Form>
    }
}