"""API de gestion des événements et statistiques.""" from __future__ import annotations import logging from datetime import datetime from fastapi import APIRouter, Request from pydantic import BaseModel from backend.services.event_service import slugify logger = logging.getLogger(__name__) router = APIRouter() class EventUpdate(BaseModel): name: str new_event: bool = False # True = archive l'ancien et crée un nouveau @router.get("/event") async def get_current_event(request: Request): """Retourne l'événement en cours avec ses statistiques.""" cfg = request.app.state.config event_svc = request.app.state.event_service ev = cfg.event stats = await event_svc.get_stats(ev.slug) return { "name": ev.name, "slug": ev.slug, "started_at": ev.started_at, "started_at_iso": ( datetime.fromtimestamp(ev.started_at).isoformat() if ev.started_at else None ), "stats": stats, } @router.put("/event") async def update_event(request: Request, payload: EventUpdate): """Met à jour l'événement en cours. Si new_event=True : archive le précédent et démarre un nouvel événement (les stats repartent de zéro). Si new_event=False : renomme l'événement en cours (même slug ou nouveau slug, les stats existantes restent sous l'ancien slug). """ cfg = request.app.state.config config_svc = request.app.state.config_service event_svc = request.app.state.event_service new_slug = slugify(payload.name) now = datetime.now().timestamp() old_slug = cfg.event.slug if payload.new_event and old_slug and old_slug != new_slug: # Archive l'ancien événement await event_svc.archive_event(old_slug) # Crée ou met à jour la ligne dans la DB await event_svc.ensure_event(new_slug, payload.name, now if payload.new_event else cfg.event.started_at or now) # Persiste dans settings.yaml started = now if payload.new_event or not cfg.event.started_at else cfg.event.started_at config_svc.save_event_config(payload.name, new_slug, started) stats = await event_svc.get_stats(new_slug) return { "ok": True, "name": payload.name, "slug": new_slug, "started_at": started, "new_event": payload.new_event, "stats": stats, } @router.get("/event/history") async def get_event_history(request: Request): """Retourne tous les événements passés avec leurs statistiques.""" event_svc = request.app.state.event_service history = await event_svc.get_history() # Ajoute les dates ISO pour l'affichage for ev in history: if ev.get("started_at"): ev["started_at_iso"] = datetime.fromtimestamp(ev["started_at"]).strftime("%d/%m/%Y %H:%M") if ev.get("ended_at"): ev["ended_at_iso"] = datetime.fromtimestamp(ev["ended_at"]).strftime("%d/%m/%Y %H:%M") else: ev["ended_at_iso"] = None return {"events": history}