import os
import pandas as pd
import numpy as np
from time import sleep

 
def deletar_arquivo_gerado():
    print("deltando arquivo...")
    diretorio = 'data'  # nome da pasta principal
    pastas = listar_pastas(diretorio)   
    
    for pasta in pastas:
        print(f"Encontrada pasta: {pasta}")
        output_csv = f"./{pasta}.csv"
        deletar_arquivo(output_csv)


def deletar_arquivo(caminho_arquivo):
    try:
        os.remove(caminho_arquivo)
        print(f"Arquivo {caminho_arquivo} deletado com sucesso.")
    except FileNotFoundError:
        print(f"O arquivo {caminho_arquivo} não foi encontrado.")
    except PermissionError:
        print(f"Sem permissão para deletar o arquivo {caminho_arquivo}.")
    except Exception as e:
        print(f"Ocorreu um erro ao tentar deletar o arquivo {caminho_arquivo}: {e}")


def carregar_arquivo():
    print("Carregando arquivo...")
    diretorio = 'data'  # nome da pasta principal
    pastas = listar_pastas(diretorio)
    
    for pasta in pastas:
        print(f"Encontrada pasta: {pasta}")

        # Chamar a função
        diretorio = f"./data/{pasta}/dados"
        print(diretorio)
        output_csv = f"./{pasta}_dados.csv"
        processar_arquivos_txt(diretorio, output_csv)




def listar_pastas(diretorio):
    pastas = [nome for nome in os.listdir(diretorio) if os.path.isdir(os.path.join(diretorio, nome))]
    return pastas


def carregar_arquivoxls_mais_proxima():
    print("Carregando arquivo...")
    diretorio = 'data'  # nome da pasta principal
    pastas = listar_pastas(diretorio)
    
    for pasta in pastas:
        print(f"Encontrada pasta: {pasta}")
        diretorio = f"./data/{pasta}/{pasta}.xls"
        
        output_csv = f"./11estacaoproxima/proxima_{pasta}.csv"
        processar_arquivos_xls(diretorio, output_csv)
        print(output_csv)
        sleep(3)   
        processar_arquivos_xls2(output_csv)

# Função para calcular a distância euclidiana
def calcular_distancia(lat1, lon1, lat2, lon2):
    return np.sqrt((lat1 - lat2) ** 2 + (lon1 - lon2) ** 2)

def processar_arquivos_xls(arquivo, output_csv):

    db = pd.read_excel(arquivo, decimal='.')


    db.columns = db.columns.str.strip()

    df = pd.DataFrame()

    # Verificar a existência das colunas antes de acessar
    if 'CODIGO' in db.columns and 'LATITUDE' in db.columns and 'LONGITUDE' in db.columns and 'NOME' in db.columns:
        df['CODIGO'] = db['CODIGO']
        df['LATITUDE'] = db['LATITUDE']
        df['LONGITUDE'] = db['LONGITUDE']
        df['NOME'] = db['NOME']
    else:
        print("Uma ou mais colunas esperadas não estão presentes no DataFrame.")


    df.to_csv(output_csv, sep=";", encoding='utf-8', decimal=',', index=False)        


def processar_arquivos_xls2(output_csv):
    df = pd.read_csv(output_csv, encoding='utf-8', sep=';', decimal=',')
    df['1p'] = ''
    df['2p'] = ''
    df['3p'] = ''
    df['4p'] = ''
    df['5p'] = ''
    df['6p'] = ''
    df['7p'] = ''
    df['8p'] = ''
    df['9p'] = ''
    df['10p'] = ''

    df['1c'] = ''
    df['2c'] = ''
    df['3c'] = ''
    df['4c'] = ''
    df['5c'] = ''
    df['6c'] = ''
    df['7c'] = ''
    df['8c'] = ''
    df['9c'] = ''
    df['10c'] = ''





    df['LATITUDE'] = pd.to_numeric(df['LATITUDE'], errors='coerce')
    df['LONGITUDE'] = pd.to_numeric(df['LONGITUDE'], errors='coerce')

        # Iterar sobre cada linha para encontrar as três estações mais próximas
    for i, row in df.iterrows():
        lat1, lon1 = row['LATITUDE'], row['LONGITUDE']
        distancias = df.apply(lambda x: calcular_distancia(lat1, lon1, x['LATITUDE'], x['LONGITUDE']), axis=1)
        distancias[i] = np.inf  # Excluir a própria estação
        proximas = distancias.nsmallest(10).index  # Pegar os índices das três menores distâncias************

        df.at[i, '1p'] = df.at[proximas[0], 'NOME']
        df.at[i, '2p'] = df.at[proximas[1], 'NOME']
        df.at[i, '3p'] = df.at[proximas[2], 'NOME']
        df.at[i, '4p'] = df.at[proximas[3], 'NOME']
        df.at[i, '5p'] = df.at[proximas[4], 'NOME']       
        df.at[i, '6p'] = df.at[proximas[5], 'NOME']
        df.at[i, '7p'] = df.at[proximas[6], 'NOME']
        df.at[i, '8p'] = df.at[proximas[7], 'NOME']
        df.at[i, '9p'] = df.at[proximas[8], 'NOME']
        df.at[i, '10p'] = df.at[proximas[9], 'NOME']

        df.at[i, '1c'] = df.at[proximas[0], 'CODIGO']
        df.at[i, '2c'] = df.at[proximas[1], 'CODIGO']
        df.at[i, '3c'] = df.at[proximas[2], 'CODIGO']
        df.at[i, '4c'] = df.at[proximas[3], 'CODIGO']
        df.at[i, '5c'] = df.at[proximas[4], 'CODIGO']
        df.at[i, '6c'] = df.at[proximas[5], 'CODIGO']
        df.at[i, '7c'] = df.at[proximas[6], 'CODIGO']
        df.at[i, '8c'] = df.at[proximas[7], 'CODIGO']
        df.at[i, '9c'] = df.at[proximas[8], 'CODIGO']
        df.at[i, '10c'] = df.at[proximas[9], 'CODIGO']

    df.to_csv(output_csv, sep=";", encoding='utf-8', decimal=',', index=False)        





def processar_arquivos_txt(diretorio, output_csv):
    # Lista para armazenar os DataFrames
    lista_dfs = []

    # Percorrer todos os arquivos no diretório
    for arquivo in os.listdir(diretorio):
        if arquivo.endswith(".txt"):
            # Caminho completo do arquivo
            caminho_arquivo = os.path.join(diretorio, arquivo)
            
            # Nome do código a partir do nome do arquivo (sem a extensão .txt)
            codigo = arquivo.split('.')[0]
            print(f"Processando arquivo: {codigo}")
            
            # Leitura do arquivo txt
            df = pd.read_csv(caminho_arquivo, delim_whitespace=True, header=None)
            # Renomear colunas
            df.columns = ['Dia', 'Mes', 'Ano', 'Valor']
            # Criar coluna de data a partir das colunas Dia, Mes, Ano
            
            df['Data'] = pd.to_datetime(df['Ano'].astype(str) + '-' + df['Mes'].astype(str) + '-' + df['Dia'].astype(str), errors='coerce')

            df = df.drop(columns=['Dia', 'Mes', 'Ano'])
            
            # Selecionar colunas necessárias e adicionar a coluna Código
            df_final = df[['Data', 'Valor']].copy()
            df_final['Codigo'] = codigo
            
            # Reordenar as colunas
            df_final = df_final[['Codigo', 'Data', 'Valor']]
            
            # Adicionar o DataFrame processado à lista
            lista_dfs.append(df_final)

    # Concatenar todos os DataFrames em um único DataFrame
    df_resultado = pd.concat(lista_dfs, ignore_index=True)
    


    # Salvar o DataFrame em um arquivo CSV
    df_resultado.columns = df_resultado.columns.str.upper()
    
    output_csv="./01processados/"+output_csv
    df_resultado.to_csv(output_csv, index=False, sep=";", decimal=",")

    print(f"Dados salvos em {output_csv}")