import streamlit as st
from streamlit_option_menu import option_menu
from tools.utilities import load_css
import json

from views.dashboard import Dashboard
from views.data_annotation import DataAnnotation
from views.model_training import ModelTraining
from views.model_tuning import ModelTuning
from views.data_inference import DataInference
from views.setup import Setup
from views.data_review import DataReview
from views.about import About

import streamlit_javascript as st_js

st.set_page_config(
    page_title="Sparrow",
    page_icon="favicon.ico",
    layout="wide"
)

load_css()


class Model:
    menuTitle = "Sparrow"
    option1 = "Dashboard"
    option2 = "Data Annotation"
    option3 = "Model Training"
    option4 = "Model Tuning"
    option5 = "Inference"
    option6 = "Data Review"
    option7 = "Setup"
    option8 = "About"

    menuIcon = "menu-up"
    icon1 = "speedometer"
    icon2 = "activity"
    icon3 = "motherboard"
    icon4 = "graph-up-arrow"
    icon5 = "journal-arrow-down"
    icon6 = "droplet"
    icon7 = "clipboard-data"
    icon8 = "chat"


def view(model):
    with st.sidebar:
        menuItem = option_menu(model.menuTitle,
                               [model.option1, model.option2, model.option5, model.option6, model.option7, model.option8],
                               icons=[model.icon1, model.icon2, model.icon5, model.icon6, model.icon7, model.icon8],
                               menu_icon=model.menuIcon,
                               default_index=0,
                               styles={
                                   "container": {"padding": "5!important", "background-color": "#fafafa"},
                                   "icon": {"color": "black", "font-size": "25px"},
                                   "nav-link": {"font-size": "16px", "text-align": "left", "margin": "0px",
                                                "--hover-color": "#eee"},
                                   "nav-link-selected": {"background-color": "#037ffc"},
                               })

    if menuItem == model.option1:
        Dashboard().view(Dashboard.Model())
        logout_widget()

    if menuItem == model.option2:
        if 'ui_width' not in st.session_state or 'device_type' not in st.session_state or 'device_width' not in st.session_state:
            # Get UI width
            ui_width = st_js.st_javascript("window.innerWidth", key="ui_width_comp")
            device_width = st_js.st_javascript("window.screen.width", key="device_width_comp")

            if ui_width > 0 and device_width > 0:
                # Add 20% of current screen width to compensate for the sidebar
                ui_width = round(ui_width + (20 * ui_width / 100))

                if device_width > 768:
                    device_type = 'desktop'
                else:
                    device_type = 'mobile'

                st.session_state['ui_width'] = ui_width
                st.session_state['device_type'] = device_type
                st.session_state['device_width'] = device_width

                st.experimental_rerun()
        else:
            DataAnnotation().view(DataAnnotation.Model(), st.session_state['ui_width'], st.session_state['device_type'],
                                  st.session_state['device_width'])
        logout_widget()

    if menuItem == model.option3:
        ModelTraining().view(ModelTraining.Model())
        logout_widget()

    if menuItem == model.option4:
        ModelTuning().view(ModelTuning.Model())
        logout_widget()

    if menuItem == model.option5:
        if 'ui_width' not in st.session_state or 'device_type' not in st.session_state or 'device_width' not in st.session_state:
            # Get UI width
            ui_width = st_js.st_javascript("window.innerWidth", key="ui_width_comp")
            device_width = st_js.st_javascript("window.screen.width", key="device_width_comp")

            if ui_width > 0 and device_width > 0:
                # Add 20% of current screen width to compensate for the sidebar
                ui_width = round(ui_width + (20 * ui_width / 100))

                if device_width > 768:
                    device_type = 'desktop'
                else:
                    device_type = 'mobile'

                st.session_state['ui_width'] = ui_width
                st.session_state['device_type'] = device_type
                st.session_state['device_width'] = device_width

                st.experimental_rerun()
        else:
            DataInference().view(DataInference.Model(), st.session_state['ui_width'], st.session_state['device_type'],
                                 st.session_state['device_width'])

        logout_widget()

    if menuItem == model.option6:
        if 'ui_width' not in st.session_state or 'device_type' not in st.session_state or 'device_width' not in st.session_state:
            # Get UI width
            ui_width = st_js.st_javascript("window.innerWidth", key="ui_width_comp")
            device_width = st_js.st_javascript("window.screen.width", key="device_width_comp")

            if ui_width > 0 and device_width > 0:
                # Add 20% of current screen width to compensate for the sidebar
                ui_width = round(ui_width + (20 * ui_width / 100))

                if device_width > 768:
                    device_type = 'desktop'
                else:
                    device_type = 'mobile'

                st.session_state['ui_width'] = ui_width
                st.session_state['device_type'] = device_type
                st.session_state['device_width'] = device_width

                st.experimental_rerun()
        else:
            DataReview().view(DataReview.Model(), st.session_state['ui_width'], st.session_state['device_type'],
                              st.session_state['device_width'])

        logout_widget()

    if menuItem == model.option7:
        Setup().view(Setup.Model())
        logout_widget()

    if menuItem == model.option8:
        About().view(About.Model())
        logout_widget()


def logout_widget():
    with st.sidebar:
        st.markdown("---")
        # st.write("User:", "John Doe")
        st.write("Version:", "2.0.0")
        # st.button("Logout")
        # st.markdown("---")

        if 'visitors' not in st.session_state:
            with open("docs/visitors.json", "r") as f:
                visitors_json = json.load(f)
                visitors = visitors_json["meta"]["visitors"]

            visitors += 1
            visitors_json["meta"]["visitors"] = visitors

            with open("docs/visitors.json", "w") as f:
                json.dump(visitors_json, f)

            st.session_state['visitors'] = visitors
        else:
            visitors = st.session_state['visitors']

        st.write("Counter:", visitors)


view(Model())