from abc import ABC, abstractmethod
import numpy as np

from models.core import GPSPoint
from models.processing import AlignmentResult


class MetricRefinementBase(ABC):
    @abstractmethod
    async def refine_alignment(
        self,
        uav_image: np.ndarray,
        satellite_image: np.ndarray,
        initial_homography: np.ndarray,
    ) -> AlignmentResult:
        pass

    @abstractmethod
    async def compute_precise_gps(
        self,
        uav_center_pixel: tuple[float, float],
        homography: np.ndarray,
        tile_bounds: dict,
    ) -> GPSPoint:
        pass

    @abstractmethod
    async def estimate_reprojection_error(
        self,
        correspondences: np.ndarray,
        homography: np.ndarray,
    ) -> float:
        pass

    @abstractmethod
    async def filter_outliers(
        self,
        correspondences: np.ndarray,
        homography: np.ndarray,
        threshold: float = 3.0,
    ) -> np.ndarray:
        pass

