# script com funções auxiliares

import csv


# gravar dados importados para ficheiro csv
def gravar_dados_ficheiro_csv(
    nome_ficheiro: str, dados_importados: list, campos: list
) -> None:
    """
    Guarda dados em um ficheiro CSV.

    Args:
        nome_ficheiro (str): O nome do ficheiro CSV.
        dados_importados (list): Uma lista de dicionários com os dados a serem
            gravados.
        campos (list): Uma lista com os nomes dos campos a serem gravados.

    Raises:
        ValueError: Se algum dos argumentos não for do tipo esperado.

    Returns:
        None
    """
    # validacao de parametros da funcao
    if not isinstance(nome_ficheiro, str):
        raise ValueError("'nome_ficheiro' não é do tipo 'str'")
    if not isinstance(dados_importados, list):
        raise ValueError("'dados_importados' não é do tipo 'list'")
    if not isinstance(campos, list):
        raise ValueError("'campos' não é do tipo 'list'")

    with open(nome_ficheiro, "w", newline="") as ficheiro_csv_historico_precos:
        ficheiroCSV = csv.DictWriter(ficheiro_csv_historico_precos, fieldnames=campos)
        ficheiroCSV.writeheader()
        ficheiroCSV.writerows(dados_importados)


# carregar dados de ficheiro csv e guardar em lista
def carregar_dados_ficheiro_csv(nome_ficheiro: str, campos: list) -> list:
    """
    Carrega dados de um ficheiro CSV e retorna uma lista de dicionários.

    Args:
        nome_ficheiro (str): O nome do ficheiro CSV.
        campos (list): Uma lista de nomes de campos correspondentes aos
            chaves dos dicionários.

    Raises:
        ValueError: Se algum dos argumentos for inválido.

    Returns:
        list: Uma lista de dicionários contendo os dados do ficheiro CSV.

    """
    # validacao de metodos da funcao
    if not isinstance(nome_ficheiro, str):
        raise ValueError("'nome_ficheiro' não é do tipo 'str'")
    if not isinstance(campos, list):
        raise ValueError("'campos' não é do tipo 'list'")

    with open(nome_ficheiro, "r", newline="") as ficheiro_csv_historico_precos:
        ficheiroCSV = csv.DictReader(ficheiro_csv_historico_precos, fieldnames=campos)
        lista_linhas_ficheiro_csv: list = []
        for linha in ficheiroCSV:
            lista_linhas_ficheiro_csv.append(linha)
    return lista_linhas_ficheiro_csv


# validar chave API http://192.168.1.131:3000/sanctus/crypto_portfolio/issues/1
def validarChaveAPI(chave_api: str) -> bool:
    # remover espaços em branco
    chave_api.strip()
    # chave invalida se tamanho for diferente de 27 ('CG-' + 24)
    if len(chave_api) != 27:
        return False
    # chave inválida se primeiros 3 caracteres forem diferentes de 'CG-'
    if len(chave_api) >= 3 and chave_api[0:3] != "CG-":
        return False
    return True
