"""Welcome to Reflex! This file outlines the steps to create a basic app."""
from typing import Callable

import reflex as rx

from .pages import chatapp_page, datatable_page, forms_page, graphing_page, home_page
from .sidebar import sidebar
from .state import State
from .styles import *

meta = [
    {
        "name": "viewport",
        "content": "width=device-width, shrink-to-fit=no, initial-scale=1",
    },
]


def template(main_content: Callable[[], rx.Component]) -> rx.Component:
    """The template for each page of the app.

    Args:
        main_content (Callable[[], rx.Component]): The main content of the page.

    Returns:
        rx.Component: The template for each page of the app.
    """
    menu_button = rx.chakra.box(
        rx.chakra.menu(
            rx.chakra.menu_button(
                rx.chakra.icon(
                    tag="hamburger",
                    size="4em",
                    color=text_color,
                ),
            ),
            rx.chakra.menu_list(
                rx.chakra.menu_item(rx.chakra.link("Home", href="/", width="100%")),
                rx.chakra.menu_divider(),
                rx.chakra.menu_item(
                    rx.chakra.link(
                        "About", href="https://github.com/reflex-dev", width="100%"
                    )
                ),
                rx.chakra.menu_item(
                    rx.chakra.link(
                        "Contact", href="mailto:founders@=reflex.dev", width="100%"
                    )
                ),
            ),
        ),
        position="fixed",
        right="1.5em",
        top="1.5em",
        z_index="500",
    )

    return rx.chakra.hstack(
        sidebar(),
        main_content(),
        rx.chakra.spacer(),
        menu_button,
        align_items="flex-start",
        transition="left 0.5s, width 0.5s",
        position="relative",
        left=rx.cond(State.sidebar_displayed, "0px", f"-{sidebar_width}"),
    )


@rx.page("/", meta=meta)
@template
def home() -> rx.Component:
    """Home page.

    Returns:
        rx.Component: The home page.
    """
    return home_page()


@rx.page("/forms", meta=meta)
@template
def forms() -> rx.Component:
    """Forms page.

    Returns:
        rx.Component: The settings page.
    """
    return forms_page()


@rx.page("/graphing", meta=meta)
@template
def graphing() -> rx.Component:
    """Graphing page.

    Returns:
        rx.Component: The graphing page.
    """
    return graphing_page()


@rx.page("/datatable", meta=meta)
@template
def datatable() -> rx.Component:
    """Data Table page.

    Returns:
        rx.Component: The chatapp page.
    """
    return datatable_page()


@rx.page("/chatapp", meta=meta)
@template
def chatapp() -> rx.Component:
    """Chatapp page.

    Returns:
        rx.Component: The chatapp page.
    """
    return chatapp_page()


# Create the app.
app = rx.App(style=base_style)
