# frozen_string_literal: true

# Helper class for column sorting in Pagination.
#
# Examples:
#
#   @direction = SortDirection.new(:asc)
#   @direction.to_s # => "ASC"
#   @direction.downcase # => 'asc'
#   @direction.opposite # => 'DESC'
#
#   SortDirection.new(:wrong).to_s # => 'ASC'
#
class SortDirection

  ##
  # When given an unknown or nil direction, default to this value
  DEFAULT_DIRECTION = "ASC"

  ##
  # Possible sort direction values
  DIRECTIONS = %w[ASC DESC]

  ##
  # The direction represented as an uppercase, abbreviated String
  attr_reader :direction

  alias to_s direction

  ##
  # The direction as uppercase
  #
  # Returns String
  delegate :uppercase, to: :direction

  ##
  # The direction as lowercase
  #
  # Returns String
  delegate :downcase, to: :direction

  # Initialize a new SortDirection
  #
  # direction - The direction (asc or desc) we want to sort results by
  def initialize(direction = nil)
    @direction = direction.to_s.upcase.presence_in(DIRECTIONS) || DEFAULT_DIRECTION
  end

  # The opposite direction to this one. Returns asc for desc, and desc for asc.
  #
  # Returns String
  def opposite
    @opposite ||= DIRECTIONS[DIRECTIONS.index(direction) - 1]
  end

end
