#cython: language_level=3
from libcpp cimport bool

cdef extern from "orientation.cc":
  pass

cdef extern from "orientation.hpp":
  cdef cppclass Quaternion "Eigen::Quaterniond":
    Quaternion()
    Quaternion(double, double, double, double)
    double w()
    double x()
    double y()
    double z()

  cdef cppclass Vector3 "Eigen::Vector3d":
    Vector3()
    Vector3(double, double, double)
    double operator()(int)

  cdef cppclass Matrix3 "Eigen::Matrix3d":
    Matrix3()
    Matrix3(double*)

    double operator()(int, int)

  Quaternion euler2quat(Vector3)
  Vector3 quat2euler(Quaternion)
  Matrix3 quat2rot(Quaternion)
  Quaternion rot2quat(Matrix3)
  Vector3 rot2euler(Matrix3)
  Matrix3 euler2rot(Vector3)
  Matrix3 rot_matrix(double, double, double)
  Vector3 ecef_euler_from_ned(ECEF, Vector3)
  Vector3 ned_euler_from_ecef(ECEF, Vector3)


cdef extern from "coordinates.cc":
  cdef struct ECEF:
    double x
    double y
    double z

  cdef struct NED:
    double n
    double e
    double d

  cdef struct Geodetic:
    double lat
    double lon
    double alt
    bool radians

  ECEF geodetic2ecef(Geodetic)
  Geodetic ecef2geodetic(ECEF)

  cdef cppclass LocalCoord_c "LocalCoord":
    Matrix3 ned2ecef_matrix
    Matrix3 ecef2ned_matrix

    LocalCoord_c(Geodetic, ECEF)
    LocalCoord_c(Geodetic)
    LocalCoord_c(ECEF)

    NED ecef2ned(ECEF)
    ECEF ned2ecef(NED)
    NED geodetic2ned(Geodetic)
    Geodetic ned2geodetic(NED)

cdef extern from "coordinates.hpp":
  pass