from abc import ABC, abstractmethod
from typing import Optional
import numpy as np

from models.images import ImageData
from models.results import FrameResult
from models.processing import RelativePose
from models.recovery import UserAnchor


class FlightProcessingEngineBase(ABC):
    @abstractmethod
    async def process_frame(
        self, flight_id: str, image: ImageData
    ) -> Optional[FrameResult]:
        pass

    @abstractmethod
    async def get_relative_pose(
        self, prev_image: np.ndarray, curr_image: np.ndarray
    ) -> RelativePose:
        pass

    @abstractmethod
    async def apply_user_anchor(
        self, flight_id: str, frame_id: int, anchor: UserAnchor
    ) -> bool:
        pass

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

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

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

