import numpy as np

from .base import CoordinateTransformerBase
from models.core import GPSPoint
from models.satellite import TileBounds


class CoordinateTransformer(CoordinateTransformerBase):
    def gps_to_local(
        self, gps: GPSPoint, origin: GPSPoint
    ) -> tuple[float, float]:
        raise NotImplementedError

    def local_to_gps(
        self, local: tuple[float, float], origin: GPSPoint
    ) -> GPSPoint:
        raise NotImplementedError

    def pixel_to_gps(
        self,
        pixel: tuple[float, float],
        homography: np.ndarray,
        tile_bounds: TileBounds,
    ) -> GPSPoint:
        raise NotImplementedError

    def gps_to_pixel(
        self,
        gps: GPSPoint,
        homography: np.ndarray,
        tile_bounds: TileBounds,
    ) -> tuple[float, float]:
        raise NotImplementedError

    def compute_distance_meters(
        self, gps1: GPSPoint, gps2: GPSPoint
    ) -> float:
        raise NotImplementedError

    def compute_bearing(
        self, from_gps: GPSPoint, to_gps: GPSPoint
    ) -> float:
        raise NotImplementedError

    def offset_gps(
        self, gps: GPSPoint, distance_m: float, bearing_deg: float
    ) -> GPSPoint:
        raise NotImplementedError

