# script para criar um historico de preços de criptomoedas, guardado em ficheiro
# CSV, com intuito de utilizar este historico de precos para acompanhar evolução
# de portfolio de criptomoedas

# aceder ao historico de preços OHLC de CoinGecko através da API
#   máximo de requests mensal: 10000 (320/dia; 13/hora)
#   . referenciar o uso da CoinGecko através de branding oficial e
#     link para site (https://www.coingecko.com/en/branding)
#   . documentação API: https://docs.coingecko.com/v3.0.1/reference/introduction
#   . obter OHLC: https://docs.coingecko.com/v3.0.1/reference/coins-id-ohlc
import requests
import pandas as pd
import mplfinance as mpf
import modulos.aux as aux

url_raiz_API = 'https://api.coingecko.com/api/v3/'

criptomoeda = 'bitcoin'
vs_currency = 'eur'
dias = '30'
precisao = '3'
url_consulta_ohlc = 'coins/' + criptomoeda + \
    '/ohlc?vs_currency=' + vs_currency + \
    '&days=' + dias + \
    '&precision=' + precisao

url = url_raiz_API + url_consulta_ohlc

CHAVE_API = 'CG-K5RS5VXsdFDip2UvY3z8VjQP'
headers = {
    'accept': 'application/json',
    'x-cg-demo-api-key': CHAVE_API
}

resposta = requests.get(url, headers= headers)

# carregar dados já existentes em ficheiro CSV para dicionario
# (criar ficheiro se não existir) 
import csv
import os
cabecalho: list = [
    'data_unix',
    'criptomoeda',
    'vs_currency',
    'preco_abertura',
    'preco_maximo',
    'preco_minimo',
    'preco_fecho'
]
caminho_ficheiro_historico_csv = f'./dados/{criptomoeda}.csv'
if (not os.path.exists(caminho_ficheiro_historico_csv)):
    ficheiro = open(caminho_ficheiro_historico_csv, 'w+', newline='')
    ficheiroCSV = csv.DictWriter(ficheiro, fieldnames=cabecalho)
    ficheiroCSV.writeheader()
    ficheiro.close()
with open(caminho_ficheiro_historico_csv,
          'r',
          newline='') as ficheiro_csv_historico_precos:
    ficheiroCSV = csv.DictReader(ficheiro_csv_historico_precos)
    lista_linhas_ficheiro_csv: list = []
    for linha in ficheiroCSV:
        lista_linhas_ficheiro_csv.append(linha)

# converter dados de coingecko para o formato usado no ficheiro CSV
lista_linhas_resposta: list = []
for linha_resposta in resposta.json():
    nova_entrada: dict = {}
    nova_entrada[cabecalho[0]] = str(linha_resposta[0])
    nova_entrada[cabecalho[1]] = criptomoeda
    nova_entrada[cabecalho[2]] = vs_currency
    nova_entrada[cabecalho[3]] = str(linha_resposta[1])
    nova_entrada[cabecalho[4]] = str(linha_resposta[2])
    nova_entrada[cabecalho[5]] = str(linha_resposta[3])
    nova_entrada[cabecalho[6]] = str(linha_resposta[4])
    lista_linhas_resposta.append(nova_entrada)

# adicionar items de lista_linhas_resposta se não existirem em 
# lista_linhas_ficheiro_csv 
# (aka: adicionar apenas items novos a lista_linhas_ficheiro_csv)
for item_resposta in lista_linhas_resposta:
    item_existe: bool = False
    for linha_ficheiro_csv in lista_linhas_ficheiro_csv:
        if (item_resposta == linha_ficheiro_csv):
            item_existe = True
    if not item_existe:
        lista_linhas_ficheiro_csv.append(item_resposta)

aux.gravar_dados_ficheiro_csv(
    caminho_ficheiro_historico_csv,
    lista_linhas_ficheiro_csv,
    cabecalho)

dados = aux.carregar_dados_ficheiro_csv(
    caminho_ficheiro_historico_csv,
    cabecalho)

print(dados)
# # mostrar dados com mplfinance

# daily = pd.read_csv(caminho_ficheiro_historico_csv, index_col=0)
# print(dail)

# daily.index.name = 'data_unix'
# daily.shape
# daily.head(3)
# daily.tail(3)

# # plotar grafico

# mpf.plot(daily)