#pragma once

#include <cmath>
#include <limits>

#include "point.hpp"

namespace kd {
namespace math {

using byte = unsigned char;

// returns the squared distance between two points
template <class T>
T distance_sq(const Point<T>& a, const Point<T>& b) {
  auto dx = a.longitude - b.longitude;
  auto dy = a.latitude - b.latitude;
  return dx * dx + dy * dy;
}

// returns the distance between two points
template <class T>
T distance(const Point<T>& a, const Point<T>& b) {
  return std::sqrt(distance_sq(a, b));
}

// returns the distance between two points looking at a specific axis
// \param axis 0 if abscissa else 1 if ordinate
template <class T>
T axial_distance(const Point<T>& a, const Point<T>& b, byte axis) {
  return axis == 0 ? a.longitude - b.longitude : a.latitude - b.latitude;
}
}
}