"""Tests para pca_explained."""

from pca_explained import pca_explained


def test_pc1_concentra_varianza_con_columnas_colineales():
    # x e y son casi colineales (y = 2x + ruido minimo); z es independiente.
    n = 50
    x = [float(i) for i in range(n)]
    y = [2.0 * i + (0.01 if i % 2 == 0 else -0.01) for i in range(n)]
    z = [float((i * 7) % 13) for i in range(n)]

    result = pca_explained({"x": x, "y": y, "z": z}, n_components=2)

    assert result["n_components"] == 2
    assert result["n_rows_used"] == n
    assert result["n_features"] == 3
    # Con dos columnas casi colineales, PC1 debe concentrar mucha varianza.
    assert result["explained_variance_ratio"][0] > 0.6
    # Cumulative es monotona creciente.
    assert result["cumulative"][-1] >= result["cumulative"][0]
    assert len(result["projection"]) == n


def test_una_sola_columna_numerica_datos_insuficientes():
    result = pca_explained({"x": [1.0, 2.0, 3.0, 4.0, 5.0]})

    assert result["n_components"] == 0
    assert result["explained_variance_ratio"] == []
    assert result["note"] == "datos insuficientes"


def test_pocas_filas_validas_datos_insuficientes():
    # Solo 2 filas validas (la tercera tiene un None) -> insuficiente.
    result = pca_explained({"a": [1.0, 2.0, None], "b": [4.0, 5.0, 6.0]})

    assert result["n_components"] == 0
    assert result["note"] == "datos insuficientes"
