lib/azan/safe_fajr.ex

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

  alias Azan.{
    Astronomical,
    CalculationParameter,
    DateUtils
  }

  use TypedStruct

  typedstruct do
    field :calculation_parameter, CalculationParameter.t()
    field :sunrise_time, DateTime.t()
    field :night, number()
    field :latitude, number()
    field :date, Date.t()
  end

  def find_time(%__MODULE__{
        calculation_parameter: %CalculationParameter{method: :moonsighting_committee},
        sunrise_time: sunrise_time,
        latitude: latitude,
        date: %Date{year: year} = date
      }) do
    Astronomical.season_adjusted_morning_twilight(
      latitude,
      date |> DateUtils.day_of_year(),
      year,
      sunrise_time
    )
  end

  def find_time(%__MODULE__{
        calculation_parameter: calculation_parameter,
        sunrise_time: sunrise_time,
        night: night
      }) do
    with %{fajr: portion} <- calculation_parameter |> CalculationParameter.night_portions(),
         night_fraction <- night * portion do
      sunrise_time |> DateUtils.shift_by_seconds(-1 * night_fraction)
    end
  end
end