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


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


def completar_com_valores_menos_um(dados, estacao, output):


    dados_df =  pd.read_csv(dados,  sep=';', decimal=',', parse_dates=['DATA'], dayfirst=True)
    start_date = '1980-01-01'
    end_date = '2024-12-31'

    filtered_df = dados_df[(dados_df['DATA'] >= start_date) & (dados_df['DATA'] <= end_date)]

    dados_df=filtered_df

    dados_df.head(2)
    estacao_df =  pd.read_csv(estacao, encoding='utf-8', sep=';', decimal=',')
    estacao_df.head(2)


    log_info = []

   # Variável booleana para verificar se encontrou somente valores <= -1
    somente_valores_menores_ou_igual_a_menos_um = False
    
    # Variáveis para armazenar o último código e valor encontrados
    ultimo_codigo_achado = None
    ultimo_valor_atualizado = None
                

    # Copiar dados_df para uma variável para atualização
    AtualizaDados = dados_df.copy()

    # Caminho do arquivo de log no diretório atual
    log_file_path = os.path.join(os.getcwd(), output+'.txt')

    # Abrir o arquivo de log para escrita
    total = len(AtualizaDados)
    with open(log_file_path, 'w') as log_file:
        # Iterar sobre AtualizaDados para atualizar os valores
        for index, row in AtualizaDados.iterrows():
            print(f"\rProcessando linha {index+1}/{total}", end='')
            valor = row['VALOR']
            data = row['DATA']
            if valor <= -1:

                log_file.write(f"Código: {row['CODIGO']}, Data: {row['DATA']}, Valor: {valor}\n")

                codigo_filtrado = row['CODIGO']
                linhas_filtradas = estacao_df.loc[estacao_df['CODIGO'] == codigo_filtrado]
                
                # Iterar sobre os códigos próximos (1codigo, 2codigo, 3codigo)
                for i in range(1, 11):  # Considerando as três primeiras colunas de códigos
                    codigo_proximo = linhas_filtradas[f'{i}c'].iloc[0]
                    filtro = (dados_df['CODIGO'] == codigo_proximo) & (dados_df['DATA'] == data)
                    valor_proximo = dados_df.loc[filtro, 'VALOR'].values
                    
                    log_file.write(f"{i}codigo: {codigo_proximo} Valor: {valor_proximo}\n")
                    
                    # Verificar se o valor encontrado não é menor ou igual a -1
                    if len(valor_proximo) > 0 and valor_proximo[0] > -1:
                        AtualizaDados.loc[index, 'VALOR'] = valor_proximo[0]
                        ultimo_codigo_achado = codigo_proximo
                        ultimo_valor_atualizado = valor_proximo[0]                        

                        log_file.write(f"Valor atual {row['VALOR']} - Valor atualizado para: {valor_proximo[0]}\n")
                        
                        break  # Parar o loop se encontrar um valor válido
                    else:
                        log_file.write(f"****Não achou o valor  \n")
                        somente_valores_menores_ou_igual_a_menos_um = True

                log_info.append({
                    'CODIGO': row['CODIGO'],
                    'DATA': row['DATA'],
                    'VALOR': valor,
                    'ULTIMO_CODIGO_ACHADO': ultimo_codigo_achado,
                    'ULTIMO_VALOR_ATUALIZADO': ultimo_valor_atualizado
                })
                log_file.write("---------------------------------------------------\n")

  # Criar DataFrame com as informações do log e salvar em um CSV
    log_df = pd.DataFrame(log_info)
    log_df.to_csv(output+'-valores de origem .csv', sep=";", encoding='utf-8', decimal=',', index=False)

    # Exibir mensagem após completar o processo
    print("Dados atualizados:")
    AtualizaDados.to_csv(output, sep=";", encoding='utf-8', decimal=',', index=False)
    #print(AtualizaDados)
    return somente_valores_menores_ou_igual_a_menos_um

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


def processar_arquivos_com_menos_um():
    print("Carregando arquivo...")
    diretorio = 'data'  # nome da pasta principal
    pastas = listar_pastas(diretorio)
    
    for pasta in pastas:
        print(f"Encontrada pasta: {pasta}")
           
        estacao = f"./11estacaoproxima/proxima_{pasta}.csv"

        dados = f"./01processados/{pasta}_dados.csv"
        
        output=f"./20dadosmenosum/{pasta}_processada.csv"
        completar_com_valores_menos_um(dados, estacao, output)     
        sleep(3)   


