lib/qr_nbu/validators/invoice_validity.ex

defmodule QRNBU.Validators.InvoiceValidity do
  @moduledoc """
  Validator for invoice validity datetime.

  Validates expiration timestamp for invoices in V003 format.
  """

  @doc """
  Validates invoice validity datetime.

  ## Rules
  - Must be a NaiveDateTime
  - Must be in the future (after current time)

  ## Examples

      iex> future = NaiveDateTime.add(NaiveDateTime.utc_now(), 86400, :second)
      iex> QRNBU.Validators.InvoiceValidity.validate(future)
      {:ok, future}

      iex> past = ~N[2020-01-01 00:00:00]
      iex> QRNBU.Validators.InvoiceValidity.validate(past)
      {:error, "Invoice validity must be in the future"}

      iex> QRNBU.Validators.InvoiceValidity.validate("2025-12-31")
      {:error, "Invoice validity must be a NaiveDateTime"}
  """
  @spec validate(NaiveDateTime.t()) :: {:ok, NaiveDateTime.t()} | {:error, String.t()}
  def validate(%NaiveDateTime{} = datetime) do
    now = NaiveDateTime.utc_now()

    case NaiveDateTime.compare(datetime, now) do
      :gt -> {:ok, datetime}
      _ -> {:error, "Invoice validity must be in the future"}
    end
  end

  def validate(_), do: {:error, "Invoice validity must be a NaiveDateTime"}
end