lib/azan/qibla.ex

defmodule Azan.Qibla do
  @moduledoc """
  Documentation for `Qibla`.
  """

  alias Azan.{
    Coordinate,
    MathUtils
  }

  def find(%Coordinate{latitude: latitude, longitude: longitude}) do
    makkah = %Coordinate{latitude: 21.4225, longitude: 39.8261}

    longitude_radian = longitude |> Math.deg2rad()
    latitude_radian = latitude |> Math.deg2rad()
    makkah_latitude_radian = makkah.latitude |> Math.deg2rad()
    makkah_longitude_radian = makkah.longitude |> Math.deg2rad()

    longitude_difference = makkah_longitude_radian - longitude_radian

    term1 = longitude_difference |> Math.sin()

    term2 = latitude_radian |> :math.cos() |> Kernel.*(makkah_latitude_radian |> :math.tan())

    term3 = latitude_radian |> :math.sin() |> Kernel.*(longitude_difference |> :math.cos())

    term1 |> :math.atan2(term2 - term3) |> Math.rad2deg() |> MathUtils.unwind_angle()
  end
end