import numpy as np

from models.core import CameraParameters


class CameraModel:
    def __init__(self, params: CameraParameters):
        self._params = params
        self._K: np.ndarray | None = None

    @property
    def intrinsic_matrix(self) -> np.ndarray:
        if self._K is None:
            fx = self._params.focal_length * self._params.resolution_width / self._params.sensor_width
            fy = self._params.focal_length * self._params.resolution_height / self._params.sensor_height
            cx, cy = self._params.get_principal_point()
            self._K = np.array([
                [fx, 0, cx],
                [0, fy, cy],
                [0, 0, 1]
            ], dtype=np.float64)
        return self._K

    def project(self, points_3d: np.ndarray) -> np.ndarray:
        raise NotImplementedError

    def unproject(self, points_2d: np.ndarray, depth: float) -> np.ndarray:
        raise NotImplementedError

    def undistort_points(self, points: np.ndarray) -> np.ndarray:
        raise NotImplementedError

    def get_fov(self) -> tuple[float, float]:
        raise NotImplementedError

