from datetime import datetime
from typing import Any, Literal

from motor.motor_asyncio import AsyncIOMotorCollection

from app.schemas.event import Event
from app.services.clip_service import ClipService

SortOrder = Literal["asc", "desc"]


class EventService:
    def __init__(self, collection: AsyncIOMotorCollection[dict[str, Any]]) -> None:
        self.collection = collection
        self.clip_service = ClipService(collection)

    async def search_events(
        self,
        camera_id: int | None,
        detected_object: str | None,
        start: datetime | None,
        end: datetime | None,
        page: int,
        limit: int,
        sort: SortOrder = "desc",
    ) -> tuple[list[Event], int]:
        query = self.clip_service._build_filter(camera_id, detected_object, start, end)
        direction = 1 if sort == "asc" else -1
        skip = (page - 1) * limit
        total = await self.collection.count_documents(query)
        cursor = (
            self.collection.find(query, {"camera_id": 1, "detected_object": 1, "timestamp": 1})
            .sort("timestamp", direction)
            .skip(skip)
            .limit(limit)
        )
        events = [
            Event(
                camera_id=document["camera_id"],
                detected_object=document["detected_object"],
                timestamp=document["timestamp"],
                clip_id=str(document["_id"]),
            )
            async for document in cursor
        ]
        return events, total
