import pandas as pd
from sklearn.ensemble import IsolationForest
import joblib
import os
import pyodbc
from datetime import datetime, timedelta

print("--- INICIANDO SCRIPT DE ENTRENAMIENTO (CONEXIÓN BD) ---")

# --- 1. Configuración de Conexión y Parámetros ---
DB_SERVER = 'TECNICA3' # O el nombre de tu instancia, ej: '.\SQLEXPRESS'
DB_DATABASE = 'SistemaGestion' # El nombre de tu base de datos
# Para autenticación de Windows, usa la siguiente línea:
CONNECTION_STRING = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={DB_SERVER};DATABASE={DB_DATABASE};Trusted_Connection=yes;TrustServerCertificate=yes;'

MODEL_FILE = 'modelo_anomalias.joblib'
CONTAMINATION_RATE = 0.001 # Tasa de contaminación del 0.013% (ajustable según tus necesidades)

# --- 2. Carga de Datos desde SQL Server ---
try:
    print(f"Conectando a la base de datos '{DB_DATABASE}' en '{DB_SERVER}'...")
    cnxn = pyodbc.connect(CONNECTION_STRING)
    
    # Tomamos el último año de datos para el entrenamiento
    fecha_limite = datetime.now() - timedelta(days=365)
    
    query = f"""
        SELECT 
            Id_Canilla AS id_canilla, 
            Fecha AS fecha, 
            CantSalida AS cantidad_enviada,
            CantEntrada AS cantidad_devuelta
        FROM 
            dist_EntradasSalidasCanillas
        WHERE 
            Fecha >= '{fecha_limite.strftime('%Y-%m-%d')}'
    """
    print("Ejecutando consulta para obtener datos de entrenamiento...")
    df = pd.read_sql(query, cnxn)
    cnxn.close()

except Exception as e:
    print(f"Error al conectar o consultar la base de datos: {e}")
    exit()

if df.empty:
    print("No se encontraron datos de entrenamiento en el último año. Saliendo.")
    exit()

# --- 3. Preparación de Datos (sin cambios) ---
print(f"Preparando {len(df)} registros para el entrenamiento...")
df['porcentaje_devolucion'] = (df['cantidad_devuelta'] / (df['cantidad_enviada'] + 0.001)) * 100
df.fillna(0, inplace=True)
df['porcentaje_devolucion'] = df['porcentaje_devolucion'].clip(0, 100)
df['dia_semana'] = df['fecha'].dt.dayofweek
features = ['id_canilla', 'porcentaje_devolucion', 'dia_semana']
X = df[features]

# --- 4. Entrenamiento y Guardado (sin cambios) ---
print(f"Entrenando el modelo con tasa de contaminación de {CONTAMINATION_RATE}...")
model = IsolationForest(n_estimators=100, contamination=CONTAMINATION_RATE, random_state=42)
model.fit(X)
joblib.dump(model, MODEL_FILE)

print(f"--- ENTRENAMIENTO COMPLETADO. Modelo guardado en '{MODEL_FILE}' ---")