import numpy as np

from data.repository import HybridDataRepository
from ml.feature_engineering import build_features
from ml.isolation_forest_service import IsolationForestService
from ml.random_forest_service import RandomForestRiskService


def main() -> None:
    repo = HybridDataRepository()
    df = repo.load_events()
    if df.empty:
        raise RuntimeError("No training data found from DB/CSV.")

    feature_rows = []
    for _, row in df.iterrows():
        payload = {
            "dispatch_weight": row.get("dispatch_weight", 0.0),
            "received_weight": row.get("received_weight", 0.0),
            "expected_duration_minutes": row.get("expected_duration_minutes", 0.0),
            "actual_duration_minutes": row.get("actual_duration_minutes", 0.0),
            "deviation_distance_km": row.get("deviation_distance_km", 0.0),
            "unexpected_stop_minutes": row.get("unexpected_stop_minutes", 0.0),
            "face_verified": row.get("face_verified", True),
        }
        feats = build_features(payload)
        feature_rows.append(feats)

    feat_df = df.iloc[: len(feature_rows)].copy()
    for k in feature_rows[0].keys():
        feat_df[k] = [x[k] for x in feature_rows]

    if "is_theft" not in feat_df.columns:
        feat_df["is_theft"] = (
            (feat_df["weight_delta"] > 0.5)
            | (feat_df["deviation_distance_km"] > 2.0)
            | (feat_df["face_mismatch"] > 0.5)
        ).astype(int)

    iso = IsolationForestService()
    iso.train(feat_df)

    rf = RandomForestRiskService()
    rf.train(feat_df, label_column="is_theft")

    print("Models trained and saved.")
    print("Label distribution:", feat_df["is_theft"].value_counts().to_dict())
    print("Weight delta mean:", float(np.mean(feat_df["weight_delta"])))


if __name__ == "__main__":
    main()
