lib/hangman/text/client/summary.ex

defmodule Hangman.Text.Client.Summary do
  @moduledoc """
  Displays a summary of the game.
  """

  alias IO.ANSI.Plus, as: ANSI
  alias Hangman.Text.Client.State

  @sp " "

  @doc """
  Displays a summary of the game.
  """
  @spec display(State.t()) :: State.t()
  def display(state) do
    message(state) |> ANSI.puts()
    state
  end

  ## Private functions

  # Word so far:  _ a n a g e d
  # Guesses left: 2
  # Letters used: a d e f g n r t u y

  @spec message(State.t()) :: ANSI.ansilist()
  defp message(%State{tally: %{turns_left: 1} = tally}) do
    # Message highlighted to signal last guess...
    [
      :reset,
      :light_yellow,
      "\nWord so far:  ",
      :light_magenta,
      "#{Enum.join(tally.letters, @sp)}",
      :light_yellow,
      "\nGuesses left: ",
      :light_magenta,
      "1",
      :light_yellow,
      "\nLetters used: ",
      :light_magenta,
      "#{Enum.join(tally.guesses, @sp)}\n"
    ]
  end

  defp message(%State{tally: tally}) do
    [
      :reset,
      :light_white,
      "\nWord so far:  ",
      :light_cyan,
      "#{Enum.join(tally.letters, @sp)}",
      :light_white,
      "\nGuesses left: ",
      :light_cyan,
      "#{tally.turns_left}",
      :light_white,
      "\nLetters used: ",
      :light_cyan,
      "#{Enum.join(tally.guesses, @sp)}\n"
    ]
  end
end