from fastapi.testclient import TestClient
from main import app

client = TestClient(app)

def test_outlier_detection_univariate():
    # Data with one clear outlier (100)
    data = [
        {"val": 10}, {"val": 11}, {"val": 12}, {"val": 10}, {"val": 100}
    ]
    request_data = {
        "data": data,
        "columns": ["val"],
        "method": "univariate"
    }
    
    response = client.post("/api/v1/analysis/detect-outliers", json=request_data)
    assert response.status_code == 200
    json_resp = response.json()
    assert json_resp["total_count"] == 1
    assert json_resp["outliers"][0]["index"] == 4
    assert "IQR bounds" in json_resp["outliers"][0]["reasons"][0]

def test_outlier_detection_multivariate():
    # Data with a multivariate anomaly
    data = [
        {"x": 1, "y": 1}, {"x": 1.1, "y": 0.9}, {"x": 0.9, "y": 1.1},
        {"x": 10, "y": 10} # Anomaly
    ]
    request_data = {
        "data": data,
        "columns": ["x", "y"],
        "method": "multivariate"
    }
    
    response = client.post("/api/v1/analysis/detect-outliers", json=request_data)
    assert response.status_code == 200
    json_resp = response.json()
    assert json_resp["total_count"] >= 1

def test_feature_importance():
    data = [
        {"x1": 1, "x2": 10, "y": 2},
        {"x1": 2, "x2": 20, "y": 4},
        {"x1": 3, "x2": 30, "y": 6},
        {"x1": 4, "x2": 40, "y": 8},
        {"x1": 5, "x2": 50, "y": 10}
    ]
    request_data = {
        "data": data,
        "features": ["x1", "x2"],
        "target": "y"
    }
    response = client.post("/api/v1/analysis/feature-importance", json=request_data)
    assert response.status_code == 200
    json_resp = response.json()
    assert len(json_resp["importances"]) == 2
    assert "feature" in json_resp["importances"][0]
    assert "score" in json_resp["importances"][0]

def test_run_regression():
    data = [
        {"x": 1, "y": 2.1},
        {"x": 2, "y": 3.9},
        {"x": 3, "y": 6.2},
        {"x": 4, "y": 8.1},
        {"x": 5, "y": 10.3}
    ]
    request_data = {
        "data": data,
        "x_features": ["x"],
        "y_target": "y",
        "model_type": "linear"
    }
    response = client.post("/api/v1/analysis/run-regression", json=request_data)
    assert response.status_code == 200
    json_resp = response.json()
    assert "results" in json_resp
    assert json_resp["results"]["r_squared"] > 0.9
    assert "const" in json_resp["results"]["coefficients"]
