import mysql.connector
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from collections import Counter
import random

# === Paso 1: Mapa de sectores del cilindro real ===
orden_ruleta = [0, 32, 15, 19, 4, 21, 2, 25, 17, 34, 6, 27,
                13, 36, 11, 30, 8, 23, 10, 5, 24, 16, 33, 1,
                20, 14, 31, 9, 22, 18, 29, 7, 28, 12, 35, 3, 26]

sector_map = {}
for i, num in enumerate(orden_ruleta):
    if i < 12:
        sector_map[num] = 1
    elif i < 24:
        sector_map[num] = 2
    else:
        sector_map[num] = 3

# === Paso 2: Función para convertir número en features ===
def features_de_numero(n):
    return [
        n,
        int(n % 2 == 0),                      # Par
        int(n in range(1,13)),               # Docena 1
        int(n in range(13,25)),              # Docena 2
        int(n in range(25,37)),              # Docena 3
        int(sector_map.get(n, 0) == 1),      # Sector 1
        int(sector_map.get(n, 0) == 2),      # Sector 2
        int(sector_map.get(n, 0) == 3)       # Sector 3
    ]

# === Paso 3: Obtener números desde MySQL ===
try:
    conn = mysql.connector.connect(
        host="localhost",
        user="root",
        password="PilHal0812!",
        database="ruleta"
    )
    cursor = conn.cursor()
    cursor.execute("SELECT numero FROM ruleta_numeros ORDER BY id ASC")
    filas = cursor.fetchall()
    cursor.close()
    conn.close()

    numeros = []
    for fila in filas:
        valor = fila[0]
        if valor is not None and str(valor).strip().isdigit():
            numeros.append(int(valor))

except Exception as e:
    print(f"❌ Error al conectar o procesar los datos: {e}")
    exit()

# === Paso 4: Construir dataset con features expandidas ===
X, y = [], []
for i in range(len(numeros) - 6):
    entrada = []
    for j in range(i, i+6):
        entrada.extend(features_de_numero(numeros[j]))
    siguiente = numeros[i+6]
    sector = sector_map.get(siguiente)
    if sector:
        X.append(entrada)
        y.append(sector)

if not X:
    print("❌ No se pudo construir el dataset.")
    exit()

# === Paso 5: Entrenar y comparar con azar ===
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

modelo = RandomForestClassifier(n_estimators=100, random_state=42)
modelo.fit(X_train, y_train)
preds = modelo.predict(X_test)
precision_modelo = accuracy_score(y_test, preds)

preds_random = [random.choice([1, 2, 3]) for _ in y_test]
precision_azar = accuracy_score(y_test, preds_random)

# === Paso 6: Imprimir resultados ===
print("\n🎯 Predicción de sectores con características adicionales")
print(f"✅ Precisión del modelo: {round(precision_modelo * 100, 2)}%")
print(f"🎲 Precisión del azar:   {round(precision_azar * 100, 2)}%")
print(f"📊 Total datos evaluados: {len(y_test)}")

# Aciertos por sector
aciertos_por_sector = Counter()
for real, pred in zip(y_test, preds):
    if real == pred:
        aciertos_por_sector[real] += 1

print("\n📈 Aciertos por sector:")
for s in [1, 2, 3]:
    print(f"  - Sector {s}: {aciertos_por_sector[s]} aciertos")
