mod theme;

pub use theme::NavBarTheme;

use crate::{icon::*, use_theme, Theme};
use leptos::*;
use thaw_components::*;
use thaw_utils::{class_list, mount_style, OptionalProp};

#[slot]
pub struct NavBarLeft {
    #[prop(optional, into)]
    class: OptionalProp<MaybeSignal<String>>,
    children: Children,
}

#[slot]
pub struct NavBarRight {
    #[prop(optional, into)]
    class: OptionalProp<MaybeSignal<String>>,
    children: Children,
}

#[component]
pub fn NavBar(
    #[prop(optional, into)] title: MaybeSignal<String>,
    #[prop(optional, into)] left_arrow: MaybeSignal<bool>,
    #[prop(optional, into)] left_text: OptionalProp<MaybeSignal<String>>,
    #[prop(optional)] nav_bar_left: Option<NavBarLeft>,
    #[prop(optional, into)] on_click_left: Option<Callback<ev::MouseEvent>>,
    #[prop(optional, into)] right_text: OptionalProp<MaybeSignal<String>>,
    #[prop(optional)] nav_bar_right: Option<NavBarRight>,
    #[prop(optional, into)] on_click_right: Option<Callback<ev::MouseEvent>>,
    #[prop(optional, into)] class: OptionalProp<MaybeSignal<String>>,
) -> impl IntoView {
    mount_style("nav-bar", include_str!("./nav-bar.css"));
    let theme = use_theme(Theme::light);
    let css_vars = create_memo(move |_| {
        theme.with(|theme| {
            format!(
                "--thaw-background-color: {};",
                theme.nav_bar.background_color
            )
        })
    });

    let on_click_left = move |ev| {
        if let Some(click_left) = on_click_left.as_ref() {
            click_left.call(ev);
        }
    };

    let on_click_right = move |ev| {
        if let Some(click_right) = on_click_right.as_ref() {
            click_right.call(ev);
        }
    };

    view! {
        <div
            class=class_list!["thaw-nav-bar", class.map(| c | move || c.get())]
            style=move || css_vars.get()
        >

            {if let Some(NavBarLeft { class, children }) = nav_bar_left {
                view! {
                    <div
                        class=class_list!["thaw-nav-bar__left", class.map(| c | move || c.get())]
                        on:click=on_click_left
                    >
                        {children()}
                    </div>
                }
                    .into_view()
            } else if let Some(left_text) = left_text.into_option() {
                view! {
                    <div class="thaw-nav-bar__left" on:click=on_click_left>
                        <If cond=left_arrow>
                            <Then slot>
                                <Icon icon=icondata_ai::AiLeftOutlined/>
                            </Then>
                        </If>
                        {move || left_text.get()}
                    </div>
                }
                    .into_view()
            } else {
                (move || {
                    if left_arrow.get() {
                        view! {
                            <div class="thaw-nav-bar__left" on:click=on_click_left>
                                <Icon icon=icondata_ai::AiLeftOutlined/>
                            </div>
                        }
                            .into()
                    } else {
                        None
                    }
                })
                    .into_view()
            }}

            <div class="thaw-nav-bar__center">{move || title.get()}</div>

            {if let Some(NavBarRight { class, children }) = nav_bar_right {
                view! {
                    <div
                        class=class_list!["thaw-nav-bar__right", class.map(| c | move || c.get())]
                        on:click=on_click_right
                    >
                        {children()}
                    </div>
                }
                    .into()
            } else if let Some(right_text) = right_text.into_option() {
                view! {
                    <div class="thaw-nav-bar__right" on:click=on_click_right>
                        {move || right_text.get()}
                    </div>
                }
                    .into()
            } else {
                None
            }}

        </div>
    }
}