import streamlit as st
import pandas as pd
import hashlib
from sqlalchemy import create_engine
from Data import credentials
from Data import vistas
import os
os.chdir('../')
from apps import Comentarios


class MultiApp:
    """Framework for combining multiple streamlit applications.
    Usage:
        def foo():
            st.title("Hello Foo")
        def bar():
            st.title("Hello Bar")
        app = MultiApp()
        app.add_app("Foo", foo)
        app.add_app("Bar", bar)
        app.run()
    It is also possible keep each application in a separate file.
        import foo
        import bar
        app = MultiApp()
        app.add_app("Foo", foo.app)
        app.add_app("Bar", bar.app)
        app.run()
    """

    def __init__(self):
        self.apps = []

    def add_app(self, title, func):
        """Adds a new application.
        Parameters
        ----------
        func:
            the python function to render this app.
        title:
            title of the app. Appears in the dropdown in the sidebar.
        """
        self.apps.append({
            "title": title,
            "function": func
        })

    def run(self):
        if len(self.apps) > 1:
            app = st.selectbox(
                '',
                self.apps,
                format_func=lambda app: app['title'])
            st.session_state['Subvista'] = app['title']
            app['function']()
        else:
            self.apps[0]['function']()


class Auth:
    '''
    Clase generada para el proceso de autenticación
    esta clase permite el acceso a las distintas vistas del portal a través de
    la contraseña y el usuario
    '''

    def __init__(self):
        self.user = ""
        self.password = ""
        self.state = ""
        self.cargo = ""
        self.mail = ""

    def log_in(self, user, password):
        url = credentials.credentials_postgresql["POSTGRESQL"]
        engine = create_engine(url, echo=False)
        credenciales = pd.read_sql_query("""select * from credenciales""",
                                         con=engine)
        credenciales.columns = ['Usuario', 'Password', 'Area', 'Cargo',
                                'Mail', 'Nombre']
        password_enc = hashlib.sha256(password.encode()).hexdigest()
        credenciales = credenciales[credenciales["Usuario"] == user]
        if len(credenciales) > 0:
            passw = credenciales.iloc[0]["Password"]
            if password_enc == passw:
                self.area = credenciales.iloc[0]["Area"]
                self.user = credenciales.iloc[0]["Usuario"]
                self.mail = credenciales.iloc[0]["Mail"]
                self.cargo = credenciales.iloc[0]["Cargo"]
                self.state = password_enc == passw
            elif password == "":
                self.state=""
            else:
                self.state = False


class ViewPortal:
    '''
    Esta clase permite asignar vistas a las distintas areas de LV las vistas
    distintas vistas desarrolladas y asginar distinas funciones a las vistas
    correspondientes
    Para añadir una vista se debe agregar una nueva key en dict_app con el
    nombre respectivo a esa vista
    Para agregar una subvista, se debe añadir en el value de la key
    correspondiente a la vista a la cual se quiere asignar
    '''
    def __init__(self):
        self.user = ""
        self.area = ""
        self.mail= ""
        dict_area = vistas.areas_port
        dict_app = vistas.views_port
        self.dict_apps = dict_app
        self.dict_area = dict_area

    def set_user(self, user, area, mail, cargo):
        self.user = user
        self.area = area
        self.mail = mail
        self.cargo = cargo

    def set_app(self, dict_apps):
        self.dict_apps = dict_apps

    def set_area(self, dict_area):
        self.dict_area = dict_area

    def run_views(self):
        '''
        Con la función run_views se corren las vistas asginadas al
        usuario respectivo, generando las vistas en la sidebar y las subivistas
        '''
        app = MultiApp()
        menu = self.dict_area[self.area]
        st.sidebar.subheader("Navegación")
        if self.user == "alehmann":
            menu.append("Análisis Inmobiliario")
        if self.cargo == "PM" or self.user == 'bull':
            menu.insert(1, "Admin Equity LATAM",)
        rad = st.sidebar.radio("", menu)
        if rad == "Home":
            col1, col2 = st.columns((7, 2))
            col1.subheader("Hola " + self.user + ",")
            col1.title("Bienvenido al Portal LVAM")
        for name in self.dict_area[self.area]:
            if rad == name and rad != "Home":
                st.session_state['Funcion'] = name
                col1, col2 = st.columns((7, 2))
                col1.markdown("""
                    # {Name}
                    """.format(Name=name))
                if rad == "Notas Analistas" and self.cargo == "Investment Analyst":
                    app.add_app("Ingresar nota", Comentarios.ingresar_nota)
                for aplicacion in list(self.dict_apps[name].keys()):
                    dic = self.dict_apps[name]
                    app.add_app(aplicacion, dic[aplicacion])
                # st.write('Para dejar tu feedback accede al siguiente [formulario](https://forms.office.com/Pages/ResponsePage.aspx?id=mpR0wfr-_kmELD83ivOlRhEm1JCbNapEi4UG-t7FamlUM0VNTUU4TFpXNzBQTFM2NEo4RzhWVFk3Si4u)')
                app.run()
                col2.image("img/logoDSTD.png")