# -*- coding: utf-8 -*-
"""
Created on Fri Mar 31 17:45:36 2023

@author: Gaspar Avit Ferrero
"""

import streamlit as st

from htbuilder import HtmlElement, div, hr, a, p, styles
from htbuilder.units import percent, px
from catboost import CatBoostClassifier


###############################
## ------- FUNCTIONS ------- ##
###############################

def link(link, text, **style):
    return a(_href=link, _target="_blank", style=styles(**style))(text)


def layout(*args):

    style = """
    <style>
      # MainMenu {visibility: hidden;}
      footer {visibility: hidden;}
     .stApp { bottom: 105px; }
    </style>
    """

    style_div = styles(
        position="fixed",
        left=0,
        bottom=0,
        margin=px(0, 0, 0, 0),
        width=percent(100),
        color="black",
        text_align="center",
        height="auto",
        opacity=1
    )

    style_hr = styles(
        display="block",
        margin=px(8, 8, "auto", "auto"),
        border_style="inset",
        border_width=px(0)
    )

    body = p()
    foot = div(
        style=style_div
    )(
        hr(
            style=style_hr
        ),
        body
    )

    st.markdown(style, unsafe_allow_html=True)

    for arg in args:
        if isinstance(arg, str):
            body(arg)

        elif isinstance(arg, HtmlElement):
            body(arg)

    st.markdown(str(foot), unsafe_allow_html=True)


def footer():
    myargs = [
        "Made with ❤️ by ",
        link("https://www.linkedin.com/in/gaspar-avit/", "Gaspar Avit"),
    ]
    layout(*myargs)


def update_prediction():
    """Callback to automatically update prediction if button has already been
    clicked"""
    if is_clicked:
        launch_prediction()


def input_layout():

    input_expander = st.expander('Input parameters', True)
    with input_expander:
        # Row 1
        col_age, col_sex = st.columns(2)
        col_age = st.slider('Age', 18, 75, on_change=update_prediction())
        col_sex = st.radio('Sex', ['Female', 'Male'],
                           on_change=update_prediction())
        st.write('div.row-widget.stRadio > div{flex-direction: row \
                 justify-content: center}', unsafe_allow_html=True)

        # Row 2
        col_height, col_weight = st.columns(2)
        col_height = st.slider(
            'Height', 140, 200, on_change=update_prediction())
        col_weight = st.slider(
            'Weight', 40, 140, on_change=update_prediction())

        # Row 3
        col_ap_hi, col_ap_lo = st.columns(2)
        col_ap_hi = st.slider(
            'AP Hi', 90, 200, on_change=update_prediction())
        col_ap_lo = st.slider(
            'AP Lo', 50, 120, on_change=update_prediction())
        

###############################
## --------- MAIN ---------- ##
###############################


if __name__ == "__main__":


    ## --- Page config ------------ ##
    # Set page title
    st.title("""
    Cardiovascular Disease predictor
    #### This app aims to give a scoring of how probable is that an individual \
    would suffer from a cardiovascular disease given its physical \
         characteristics
    #### Just enter your info and get a prediction.
    """)

    # Set page footer
    footer()
 
    ## --------------------------- ##

    # Load classification model
    model = CatBoostClassifier()      # parameters not required.
    for root, dirs, files in os.walk("./"):
        for file in files:
            if file.endswith(".cbm"):
                model.load_model(os.path.join(root, file))

    # Define inputs
    input_layout()