package gs.std.v0.effect

import java.time.Instant
import java.time.LocalDate
import java.time.OffsetDateTime
import java.time.ZonedDateTime

/** Provides date and time values.
  */
trait DateTimeProvider[F[_]]:
  /** @return
    *   The current timestamp (`java.time.Instant`).
    */
  def timestamp(): F[Instant]

  /** @return
    *   The current `java.time.Instant`.
    */
  def nowInstant(): F[Instant]

  /** @return
    *   The current date and time in the configured zone.
    */
  def nowZoned(): F[ZonedDateTime]

  /** @return
    *   The current date and time in the configured offset.
    */
  def nowOffset(): F[OffsetDateTime]

  /** @return
    *   The current date.
    */
  def today(): F[LocalDate]

  /** @return
    *   The date before today.
    */
  def yesterday(): F[LocalDate]

  /** @return
    *   The date after today.
    */
  def tomorrow(): F[LocalDate]
