import pandas as pd
from sklearn.ensemble import IsolationForest


FEATURE_COLUMNS = [
    "request_count",
    "high_velocity",
    "duplicate",
    "geo_mismatch",
    "bad_ua"
]


def train_anomaly_model(csv_file):

    data = pd.read_csv(csv_file)

    features = data[FEATURE_COLUMNS]

    model = IsolationForest(
        contamination=0.2,
        random_state=42
    )

    model.fit(features)

    return model


def get_anomaly_score(model, features):

    feature_data = pd.DataFrame(
        [features],
        columns=FEATURE_COLUMNS
    )

    decision_score = model.decision_function(feature_data)[0]

    return decision_score


def normalize_anomaly_score(score):

    # Convert IsolationForest score into 0-100 risk score.
    # Lower decision score = more anomalous.
    risk_score = 50 - (score * 100)

    # Keep score within 0-100
    risk_score = max(0, min(100, risk_score))

    return round(risk_score, 2)


if __name__ == "__main__":

    model = train_anomaly_model(
        "data/ml_features.csv"
    )

    print("IsolationForest model trained successfully.")