lib/azan/asr_time.ex

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