defmodule Azan.DhuhrTime do @moduledoc """ Documentation for `DhuhrTime`. """ use TypedStruct alias Azan.{ CalculationParameter, Coordinate, DateUtils, PolarCircleResolution, SolarTime, TimeComponent } typedstruct do field :transit, number() field :date, Date.t() field :calculation_parameter, CalculationParameter.t() field :coordinate, Coordinate.t() end def find!(%__MODULE__{ date: date, coordinate: coordinate, calculation_parameter: %CalculationParameter{ polar_circle_resolution: polar_circle_resolution } }) do %PolarCircleResolution{solar_time: %SolarTime{transit: new_transit}} = polar_circle_resolution |> PolarCircleResolution.polar_circle_resolved_values(date, coordinate) TimeComponent.new(new_transit) |> TimeComponent.create_utc_datetime(date) end def find!(%__MODULE__{ transit: transit, date: date, calculation_parameter: %CalculationParameter{ polar_circle_resolution: :unresolved } }) do TimeComponent.new(transit) |> TimeComponent.create_utc_datetime(date) end def find( transit, date, %CalculationParameter{} = calculation_parameter, %Coordinate{} = coordinate ) do {:ok, %__MODULE__{ transit: transit, date: date, calculation_parameter: calculation_parameter, coordinate: coordinate } |> __MODULE__.find!()} end def adjust(datetime, %CalculationParameter{ adjustments: %{dhuhr: adjustment}, method_adjustments: %{dhuhr: method_adjustment}, rounding: rounding }) do adjustment = adjustment |> DateUtils.sum_adjustment(method_adjustment) datetime |> DateUtils.rounded_time(adjustment, rounding) end end