from abc import ABC, abstractmethod
from typing import Optional

from models.flight import Flight, Waypoint
from models.core import GPSPoint


class FlightLifecycleManagerBase(ABC):
    @abstractmethod
    async def create_flight(
        self,
        name: str,
        description: str,
        start_gps: GPSPoint,
        rough_waypoints: list[GPSPoint],
        camera_params: dict,
        altitude: float,
    ) -> Flight:
        pass

    @abstractmethod
    async def delete_flight(self, flight_id: str) -> bool:
        pass

    @abstractmethod
    async def update_waypoints(
        self, flight_id: str, waypoints: list[Waypoint]
    ) -> bool:
        pass

    @abstractmethod
    async def get_flight(self, flight_id: str) -> Optional[Flight]:
        pass

    @abstractmethod
    async def start_processing(self, flight_id: str) -> bool:
        pass

    @abstractmethod
    async def stop_processing(self, flight_id: str) -> bool:
        pass

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

