import pandas as pd
import re
import os
from datetime import datetime, timedelta
import time


# Ruta del folder
folder_path = "/var/www/html/flask_project/bola8/profits"


# Definir los valores iniciales
start_time = datetime.strptime("10:00", "%H:%M")
end_time = datetime.strptime("15:30", "%H:%M")
symbol_value ="SPX"
name_value = "Vertical"



# Obtener la lista de archivos y ordenarlos cronológicamente
# file_list = sorted(
#     [
#         os.path.join(folder_path, filename)
#         for filename in os.listdir(folder_path)
#         if filename.endswith(".csv")
#     ],
#     key=lambda x: x.split(" ")[1].split(".")[0]  # Extraer la parte YYYYMMDD del nombre
# )

# opcion guardar ultimo
file_list = [folder_path + '/profit 20250613.csv']


# Función para construir el nombre del archivo basado en Symbol, Name y Hour
def construct_filename(symbol, name, hour):
    hour_numeric = hour.replace(":", "")  # Remover los dos puntos para convertir a numérico
    return f"/var/www/html/flask_project/bola8/makekos/{symbol}/{symbol}_{name}_strikes_{hour_numeric}.csv"

# Función para normalizar el horario al múltiplo de 5 más cercano hacia abajo
def normalize_hour(hour):
    hour_parts = [int(part) for part in hour.split(":")]
    normalized_minutes = (hour_parts[1] // 5) * 5  # Redondeo hacia abajo al múltiplo de 5
    return f"{hour_parts[0]:02}:{normalized_minutes:02}"

# Función para extraer Strike1, Strike2 y Option_Type de la columna Trade para "Vertical"
def extract_vertical_details(trade):
    match = re.search(r"(\d+)/(\d+)\s+(\w+)", trade)
    if match:
        return match.group(1), match.group(2), match.group(3)
    return None, None, None

# Función para extraer valores de Strike para "Sonar" o "Iron Condor"
def extract_condor_details(trade):
    match = re.search(r"(\d+)/(\d+)/(\d+)/(\d+)\s+CALL/PUT", trade)
    if match:
        return match.group(1), match.group(2), match.group(3), match.group(4)
    return None, None, None, None

# Iniciar el bucle desde la hora inicial hasta la hora final
current_time = start_time
while current_time <= end_time:
    hour_value = current_time.strftime("%H:%M")
    print(f"Procesando datos para la hora: {hour_value}")

    # Procesar cada archivo en la lista
    for file_path in file_list:
        # print(f"Procesando archivo: {file_path}")
        # Cargar el archivo CSV
        data = pd.read_csv(file_path, encoding='utf-8')

        # Filtrar filas válidas con formato correcto en la columna "Hour"
        valid_data = data[data['Hour'].astype(str).str.match(r'^\d{2}:\d{2}$', na=False)].copy()

        # Normalizar la columna "Hour"
        valid_data.loc[:, 'Normalized_Hour'] = valid_data['Hour'].apply(normalize_hour)

        # Crear el DataFrame procesado dependiendo de `Name`
        processed_data = None

        if name_value == "Vertical":
            vertical_data = valid_data[valid_data['Name'] == 'Vertical'].copy()
            vertical_data[['Strike1', 'Strike2', 'Option_Type']] = vertical_data['Trade'].apply(
                lambda trade: pd.Series(extract_vertical_details(trade))
            )
            processed_data = vertical_data[['Day', 'Normalized_Hour', 'Symbol', 'Name', 'Raw', 'Trade', 'Strike1', 'Strike2', 'Option_Type']].rename(columns={'Normalized_Hour': 'Hour'})

        if name_value in ["Iron Condor", "Sonar"]:
            condor_sonar_data = valid_data[valid_data['Name'].isin(['Iron Condor', 'Sonar'])].copy()
            condor_sonar_data[['Call_Strike1', 'Call_Strike2', 'Put_Strike1', 'Put_Strike2']] = condor_sonar_data['Trade'].apply(
                lambda trade: pd.Series(extract_condor_details(trade))
            )
            processed_data = condor_sonar_data[['Day', 'Normalized_Hour', 'Symbol', 'Name', 'Raw', 'Trade', 'Call_Strike1', 'Call_Strike2', 'Put_Strike1', 'Put_Strike2']].rename(columns={'Normalized_Hour': 'Hour'})

        if processed_data is not None:
            processed_file_path = "/var/www/html/flask_project/bola8/makekos/procesado.csv"
            processed_data.to_csv(processed_file_path, index=False, encoding='utf-8')
            # print("Archivo procesado y guardado en:", processed_file_path)

            data = pd.read_csv(processed_file_path, encoding='utf-8')
            matching_row = data[
                (data['Hour'] == hour_value) &
                (data['Symbol'] == symbol_value) &
                (data['Name'] == name_value)
            ]

            if not matching_row.empty:
                filename = construct_filename(symbol_value, name_value, hour_value)
                try:
                    existing_data = pd.read_csv(filename, encoding='utf-8')
                except FileNotFoundError:
                    existing_data = pd.DataFrame(columns=matching_row.columns)

                updated_data = pd.concat([existing_data, matching_row], ignore_index=True).drop_duplicates()
                updated_data.to_csv(filename, index=False, encoding='utf-8')
                # print(f"Fila agregada al archivo: {filename}")
            else:
                print(f"No se encontró ninguna fila con Hour={hour_value}, Symbol={symbol_value}, Name={name_value}")
        else:
            print("No se encontraron datos para procesar.")

    # Incrementar el tiempo en 5 minutos
    current_time += timedelta(minutes=5)
