defmodule Azan.AsrTime do
@moduledoc """
Documentation for `AsrTime`.
"""
use TypedStruct
alias Azan.{
CalculationParameter,
DateUtils,
Madhab,
SolarTime,
TimeComponent
}
typedstruct do
field :solar_time, SolarTime.t()
field :calculation_parameter, CalculationParameter.t()
field :date, Date.t()
end
def find!(%__MODULE__{
solar_time: solar_time,
date: date,
calculation_parameter: %CalculationParameter{madhab: madhab}
}) do
solar_time
|> SolarTime.afternoon(madhab |> Madhab.shadow_length())
|> TimeComponent.new()
|> TimeComponent.create_utc_datetime(date)
end
def find(
solar_time,
date,
%CalculationParameter{} = calculation_parameter
) do
{:ok,
%__MODULE__{
solar_time: solar_time,
date: date,
calculation_parameter: calculation_parameter
}
|> __MODULE__.find!()}
end
def adjust(datetime, %CalculationParameter{
adjustments: %{asr: adjustment},
method_adjustments: %{asr: method_adjustment},
rounding: rounding
}) do
adjustment = adjustment |> DateUtils.sum_adjustment(method_adjustment)
datetime |> DateUtils.rounded_time(adjustment, rounding)
end
end