# Imports
import numpy as np
import yfinance as yf
import streamlit as st
import matplotlib.pyplot as plt
from fbprophet import Prophet
from fbprophet.plot import plot_plotly
from plotly import graph_objs as go
from datetime import date
import warnings

warnings.filterwarnings("ignore")

st.set_page_config('Teste')

# Start to collect
start = '2014-09-21'
start_eur = '2014-09-21'

# End to collect - today (td = today)
today = date.today().strftime("%Y-%m-%d")

# Tittle
st.title("Real-time Interactive Dashboard for Ethereum Prediction")

# Exchange codes
exchange = ('BTC-EUR', 'BTC-USD', 'ETH-USD')

# Define de qual empresa usaremos os dados por vez
selec_exch = st.selectbox('Select Company:', exchange)


# Função para extrair e carregar os dados
@st.cache
def carrega_dados(ticker):
    if exchange == 'BTC-USD':
        dados = yf.download(ticker, start, today)
        dados.reset_index(inplace=True)
        return dados
    else:
        dados = yf.download(ticker, start_eur, today)
        dados.reset_index(inplace=True)
        return dados


# Mensagem de carga dos dados
mensagem = st.text('Carregando os dados...')  # Rever

# Carrega os dados
dados = carrega_dados(selec_exch)

# Mensagem de encerramento da carga dos dados
mensagem.text('Concluído!')

# Sub-título
st.subheader('Visualização dos Dados Brutos')
st.write(dados.tail())


# Função para o plot dos dados brutos
def plot_dados_brutos():
    fig = go.Figure()
    fig.add_trace(go.Scatter(x=dados['Date'], y=dados['Open'], name="stock_open"))
    fig.add_trace(go.Scatter(x=dados['Date'], y=dados['Close'], name="stock_close"))
    fig.layout.update(title_text='Preço de Abertura e Fechamento das Ações', xaxis_rangeslider_visible=True)
    st.plotly_chart(fig)


# Executa a função
plot_dados_brutos()

st.subheader('Previsões com Machine Learning')

# Prepara os dados para as previsões com o pacote Prophet
df_treino = dados[['Date', 'Close']]
df_treino = df_treino.rename(columns={"Date": "ds", "Close": "y"})

# Cria o modelo
modelo = Prophet()

# Treina o modelo
modelo.fit(df_treino)

# Define o horizonte de previsão
num_anos = st.slider('Horizonte de Previsão (em anos):', 1, 4)

# Calcula o período em dias
periodo = num_anos * 365

# Prepara as datas futuras para as previsões
futuro = modelo.make_future_dataframe(periods=periodo)

# Faz as previsões
forecast = modelo.predict(futuro)

# Subtitle
st.subheader('Dados Previstos')

# Dados previstos
st.write(forecast.tail())

# Title
st.subheader('Previsão de Preço dos Ativos Financeiros Para o Período Selecionado')

# Plot
graph = plot_plotly(modelo, forecast)
st.plotly_chart(graph)

# Fim
