"""Ejemplo 5 - Logica difusa: un controlador de ventilador en Python puro."""


def trapecio(x, a, b, c, d):
    """Funcion de pertenencia trapezoidal. Devuelve un grado entre 0 y 1."""
    if x <= a or x >= d:
        return 0.0
    if b <= x <= c:
        return 1.0
    if a < x < b:
        return (x - a) / (b - a)
    return (d - x) / (d - c)


# --- 1. FUSIFICACION: de un numero a grados de pertenencia ---
def fusificar(temp):
    return {
        "fria":     trapecio(temp, -10, -10, 10, 18),
        "templada": trapecio(temp, 15, 20, 24, 28),
        "calurosa": trapecio(temp, 25, 30, 50, 50),
    }


# --- 2. REGLAS DIFUSAS ---
# si la temperatura es X entonces la velocidad del ventilador es Y
VELOCIDAD = {"apagado": 0, "lenta": 35, "rapida": 100}
REGLAS = [("fria", "apagado"), ("templada", "lenta"), ("calurosa", "rapida")]


def controlar(temp):
    grados = fusificar(temp)
    activaciones = [(etiqueta, grados[etiqueta], salida) for etiqueta, salida in REGLAS]

    # --- 3. DESFUSIFICACION: promedio ponderado por el grado de activacion ---
    num = sum(g * VELOCIDAD[salida] for _, g, salida in activaciones)
    den = sum(g for _, g, _ in activaciones)
    velocidad = num / den if den else 0
    return grados, activaciones, velocidad


for t in [8, 17, 22, 26, 31]:
    grados, activaciones, v = controlar(t)
    detalle = "  ".join(f"{k}={g:.2f}" for k, g in grados.items())
    print(f"{t:>3} °C  |  {detalle}  |  ventilador = {v:.1f} %")

print("\nObserve los 17 °C y los 26 °C: la temperatura pertenece")
print("a DOS conjuntos a la vez, y la salida es intermedia.")
