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

from models.processing import RotationResult
from models.flight import HeadingRecord


class ImageRotationManagerBase(ABC):
    @abstractmethod
    async def estimate_rotation(
        self, uav_image: np.ndarray, satellite_image: np.ndarray
    ) -> RotationResult:
        pass

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

    @abstractmethod
    async def update_heading_history(
        self, flight_id: str, record: HeadingRecord
    ) -> None:
        pass

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

    @abstractmethod
    async def is_sharp_turn(
        self, flight_id: str, current_heading: float
    ) -> bool:
        pass

    @abstractmethod
    def rotate_image(self, image: np.ndarray, angle: float) -> np.ndarray:
        pass

