from abc import ABC, abstractmethod
from typing import Optional

from models.results import FrameResult, FlightResults, RefinedFrameResult
from models.core import GPSPoint


class ResultManagerBase(ABC):
    @abstractmethod
    async def save_frame_result(
        self, flight_id: str, result: FrameResult
    ) -> bool:
        pass

    @abstractmethod
    async def get_frame_result(
        self, flight_id: str, frame_id: int
    ) -> Optional[FrameResult]:
        pass

    @abstractmethod
    async def get_flight_results(self, flight_id: str) -> FlightResults:
        pass

    @abstractmethod
    async def update_refined_result(
        self, flight_id: str, result: RefinedFrameResult
    ) -> bool:
        pass

    @abstractmethod
    async def get_object_gps(
        self,
        flight_id: str,
        frame_id: int,
        pixel: tuple[float, float],
    ) -> GPSPoint:
        pass

    @abstractmethod
    async def export_results(
        self, flight_id: str, format: str = "json"
    ) -> bytes:
        pass

    @abstractmethod
    async def get_statistics(self, flight_id: str) -> dict:
        pass

