import os
import random
import pandas as pd
from dotenv import load_dotenv
from entrypoint import ENV_PATH

# Cargar variables de entorno desde ENV_PATH
load_dotenv(ENV_PATH)

class GeneradorNombre_Spanish:
    def __init__(self):
        # Obtener ruta base del proyecto
        project_path = os.getenv("PROJECT_PATH")
        if not project_path:
            raise ValueError("La variable PROJECT_PATH no está definida en el archivo .env")

        # Construir rutas absolutas a los archivos
        self.ruta_hombres = os.path.join(project_path, "data", "files", "txt", "nombres_español", "hombres.csv")
        self.ruta_mujeres = os.path.join(project_path, "data", "files", "txt", "nombres_español", "mujeres.csv")
        self.ruta_apellidos = os.path.join(project_path, "data", "files", "txt", "nombres_español", "apellidos.csv")

        # Cargar datos
        self.df_hombres = pd.read_csv(self.ruta_hombres)
        self.df_mujeres = pd.read_csv(self.ruta_mujeres)
        self.df_apellidos = pd.read_csv(self.ruta_apellidos)

        # Limpiar y normalizar columnas
        for df in (self.df_hombres, self.df_mujeres):
            df.columns = df.columns.str.strip().str.lower()
            df['frec'] = pd.to_numeric(df['frec'], errors='coerce')
            df['edad_media'] = pd.to_numeric(df['edad_media'], errors='coerce')
            df.dropna(subset=['frec', 'edad_media'], inplace=True)

        self.df_apellidos.columns = self.df_apellidos.columns.str.strip().str.lower()
        self.df_apellidos['frec_pri'] = pd.to_numeric(self.df_apellidos['frec_pri'], errors='coerce')
        self.df_apellidos['frec_seg'] = pd.to_numeric(self.df_apellidos['frec_seg'], errors='coerce')
        self.df_apellidos.dropna(subset=['frec_pri', 'frec_seg'], inplace=True)

    def generar_nombre(self, sexo: str = None, edad_aprox: float = None) -> str:
        if sexo not in {'hombre', 'mujer'}:
            sexo = random.choice(['hombre', 'mujer'])

        df = self.df_hombres if sexo == 'hombre' else self.df_mujeres

        if edad_aprox is not None:
            df = df[
                (df['edad_media'] >= edad_aprox - 5) &
                (df['edad_media'] <= edad_aprox + 5)
            ]

        if df.empty:
            raise ValueError(f"No hay nombres disponibles para edad {edad_aprox} y sexo {sexo}")

        nombre = random.choices(df['nombre'].tolist(), weights=df['frec'].tolist(), k=1)[0]
        return nombre

    def generar_nombre_completo(self, sexo: str = None, edad_aprox: float = None) -> str:
        nombre = self.generar_nombre(sexo, edad_aprox)

        primer_apellido = random.choices(
            self.df_apellidos['apellido'].tolist(),
            weights=self.df_apellidos['frec_pri'].tolist(), k=1
        )[0]

        segundo_apellido = random.choices(
            self.df_apellidos['apellido'].tolist(),
            weights=self.df_apellidos['frec_seg'].tolist(), k=1
        )[0]

        return f"{nombre} {primer_apellido} {segundo_apellido}"
