from fastapi import APIRouter, HTTPException

from core.schemas import DetectRequest, DetectResponse
from iot.route_deviation import compute_route_deviation
from ml.feature_engineering import build_features
from ml.isolation_forest_service import IsolationForestService

router = APIRouter(tags=["detection"])
detector = IsolationForestService()


@router.post("/detect", response_model=DetectResponse)
def detect(req: DetectRequest) -> DetectResponse:
    try:
        route = req.gps_trace[:2] if len(req.gps_trace) >= 2 else req.gps_trace
        deviation = compute_route_deviation(req.gps_trace, route)
        payload = req.model_dump()
        payload["deviation_distance_km"] = deviation["distance_from_route_km"]
        payload["unexpected_stop_minutes"] = deviation["unexpected_stop_minutes"]
        features = build_features(payload)
        score, is_anomaly = detector.score(features)
    except FileNotFoundError:
        raise HTTPException(status_code=503, detail="Isolation Forest model not trained. Run scripts/train_models.py")

    reasons = []
    if features["weight_delta"] > 0:
        reasons.append("weight_loss_detected")
    if deviation["distance_from_route_km"] > 0:
        reasons.append("route_deviation_detected")
    if features["duration_delta"] > 0:
        reasons.append("duration_anomaly")
    if is_anomaly and not reasons:
        reasons.append("multivariate_outlier")

    return DetectResponse(
        event_id=req.event_id,
        anomaly_score=score,
        is_anomaly=is_anomaly,
        risk_reasons=reasons,
        deviation_metrics=deviation,
    )
