defmodule Azan.SunsetTime do @moduledoc """ Documentation for `SunsetTime`. """ alias Azan.{ CalculationParameter, Coordinate, DateUtils, PolarCircleResolution, SolarTime, TimeComponent } use TypedStruct typedstruct do field :sunset, 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{sunset: new_sunset}} = polar_circle_resolution |> PolarCircleResolution.polar_circle_resolved_values(date, coordinate) TimeComponent.new(new_sunset) |> TimeComponent.create_utc_datetime(date) end def find!(%__MODULE__{ sunset: sunset, date: date, calculation_parameter: %CalculationParameter{ polar_circle_resolution: :unresolved } }) do TimeComponent.new(sunset) |> TimeComponent.create_utc_datetime(date) end def find( sunset, date, %CalculationParameter{} = calculation_parameter, %Coordinate{} = coordinate ) do {:ok, %__MODULE__{ sunset: sunset, date: date, calculation_parameter: calculation_parameter, coordinate: coordinate } |> __MODULE__.find!()} end def adjust(datetime, %CalculationParameter{ rounding: rounding }) do datetime |> DateUtils.rounded_minute(rounding) end end