from datetime import datetime, timedelta from typing import Optional from sqlalchemy.ext.asyncio import AsyncSession from app.models import Vehicle, Position, Event from app.config import settings async def detect_events( db: AsyncSession, vehicle: Vehicle, current: Position, previous: Optional[Position] ) -> list[Event]: """Обнаружение событий на основе новой позиции""" events = [] # Check for overspeed if current.speed > settings.overspeed_limit: event = Event( vehicle_id=vehicle.id, timestamp=current.timestamp, type="OVERSPEED", payload={ "speed": current.speed, "limit": settings.overspeed_limit, "lat": current.lat, "lon": current.lon } ) db.add(event) await db.commit() await db.refresh(event) events.append(event) # Check for long stop (if speed is 0 and was 0 for a while) if previous and current.speed < 2 and previous.speed < 2: time_diff = current.timestamp - previous.timestamp if time_diff >= timedelta(minutes=settings.long_stop_minutes): event = Event( vehicle_id=vehicle.id, timestamp=current.timestamp, type="LONG_STOP", payload={ "duration_minutes": time_diff.total_seconds() / 60, "lat": current.lat, "lon": current.lon } ) db.add(event) await db.commit() await db.refresh(event) events.append(event) return events