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


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


def filtro_setembro_abril_estacao(dados,  output_csv):
    # Lista dos anos para os quais queremos selecionar os dados
    anos = list(range(1980, 2023))  # De 1980 a 2022

    anos = list(range(2020, 2024))  # De 1980 a 2022

    
    # Ler os dados do CSV
    dados_df = pd.read_csv(dados, sep=';', decimal=',', parse_dates=['DATA'], dayfirst=True)



    
    # DataFrame para armazenar os dados selecionados
    dados_selecionados = pd.DataFrame()

    for ano in anos:
        # Selecionar os dados de 1 de setembro de 'ano' a 30 de abril do próximo ano ('ano' + 1)
        inicio = f'{ano}-09-01'
        fim = f'{ano+1}-04-30'
        
        selecao = (dados_df['DATA'] >= inicio) & (dados_df['DATA'] <= fim)
        dados_selecionados = pd.concat([dados_selecionados, dados_df[selecao]])
    
    # Salvar os dados selecionados em um novo arquivo CSV
    dados_selecionados.to_csv(output_csv, sep=';', encoding='utf-8', index=False, decimal=',')
    



def estacaochuvosa(dados, output_csv):  
    print(dados)

    with open(output_csv, 'w') as file:
        cabecalho = ['CODIGO', 'INICIO','FINAL']
        writer = csv.DictWriter(file, fieldnames=cabecalho,delimiter=';')
        writer.writeheader() # Escreve o cabeçalho
            
    # Ler os dados do CSV
    dados_df = pd.read_csv(dados, sep=';', decimal=',')

   # dados['VALOR'] = dados['VALOR'].astype(str)  # Garantir que todos os valores são strings


    try:
        dados['VALOR'] = dados['VALOR'].astype(str)  # Garantir que todos os valores são strings
        
        # Substituir vírgulas por pontos
        dados['VALOR'] = dados['VALOR'].str.replace(',', '.', regex=False)
        
        # Converter a coluna 'VALOR' para float
        dados['VALOR'] = pd.to_numeric(dados['VALOR'], errors='coerce')
        
        # Tratar valores NaN substituindo por 0
        dados['VALOR'] = dados['VALOR'].fillna(0)
        
    except Exception as e:
        print(f"Erro ao converter a coluna 'VALOR': {e}")

  

    #invalid_values = dados_df[~dados_df['DATA'].str.replace(',', '.').str.replace('.', '', 1).str.isnumeric()]
    #print(invalid_values)


  

    # Garantir que a coluna 'DATA' é do tipo datetime com o formato correto
    try:
        dados_df['DATA'] = pd.to_datetime(dados_df['DATA'], format='%Y-%m-%d', errors='raise')
    except Exception as e:
        raise ValueError(f"Erro ao converter a coluna 'DATA': {e}")
    
    estacao = dados_df['CODIGO'].unique()

    anos = list(range(1980, 2023))  # De 1980 a 2022

    anos = list(range(2020, 2024))  # De 1980 a 2022
    print(estacao)
    
    total = len(estacao)
    #for xrow in estacao: #percorre a lista das estacoes
    for index, xrow in enumerate(estacao):  
        print(f"\restacao chuvosa linha {index+1}/{total}", end='')
        nome_estacao=xrow
 
        for ano in anos:           

            data_inicio = datetime.strptime(f'{ano}-09-01', '%Y-%m-%d')
            data_fim = datetime.strptime(f'{ano+1}-04-30', '%Y-%m-%d')
            df_inciochuva = dados_df[(dados_df['CODIGO'] == nome_estacao) &(dados_df['DATA'] >= data_inicio) &   (dados_df['DATA'] <= data_fim)]
            marcador_inicio=False
            marcador_final=False

            somador_ml=0
            somador_ml_final_chuva=0
            for index, row in df_inciochuva.iterrows():
              #  print(index, '  ', row)

                leitura_chuva = row['VALOR']#float(row['VALOR'].replace(',', '.'))
        
                if leitura_chuva>=0:
                    somador_ml= somador_ml+leitura_chuva

                if somador_ml>=10 and not marcador_inicio:
                    marcador_inicio=True
                    data_incio_chuva= row['DATA'] 
                    ano_atual= row['DATA'].year
                    #print ('estacao:', nome_estacao,'INCIO:', data_incio_chuva, 'MM', somador_ml)
                    somador_ml=0
                    marcador_final=False
                    #print ('estacao:',ano_do_incio_chuva)    
                
            df_final_chuva =  df_inciochuva[::-1] 
        
            for index, row in df_final_chuva.iterrows():     
                leitura_chuva= row['VALOR'] 

                if leitura_chuva>=0:
                    somador_ml_final_chuva= somador_ml_final_chuva+leitura_chuva;

                if somador_ml_final_chuva>=5  and not marcador_final: 
                    marcador_final=True       
                    data_final_chuva=row['DATA'] 
                    somador_ml_final_chuva=0
                    marcador_inicio=False
                #print ('ano final chuva:', ano_do_incio_chuva+1)
            # print ('estacao:', nome_estacao,'INCIO:', data_incio_chuva,'FINAL:', data_final_chuva )
            with open(output_csv, 'a') as file:
                writer = csv.DictWriter(file, fieldnames=cabecalho, delimiter=';')                    
                writer.writerow({'CODIGO':nome_estacao, 'INICIO':data_incio_chuva.strftime('%Y-%m-%d'),'FINAL':data_final_chuva.strftime('%Y-%m-%d')})    


def processar_inicio_fim_estacao_chuvosa():
    print("Estacao chuvosa...")
    diretorio = 'data'  # nome da pasta principal
    pastas = listar_pastas(diretorio)
    
    for pasta in pastas:
        print(f"Encontrada pasta: {pasta}")
          
        dados = f"./20dadosmenosum/{pasta}_processada.csv"
        estacao =f"./{pasta}" 
        output_csv=f"./30estacaochuvosa/{pasta}_filtro_setembro_abril.csv"
        estacao_chuvosa=f"./30estacaochuvosa/{pasta}_estacao_chuvosa.csv"

        filtro_setembro_abril_estacao(dados, output_csv)
        sleep(3)   
        estacaochuvosa(output_csv, estacao_chuvosa)
       


