# ┌────────────────────────────────────────────────────────────────────┐
# │ Based on the course "Multi-Player Bingo" by Mike and Nicole Clark. │
# └────────────────────────────────────────────────────────────────────┘
defmodule Buzzword.Cache do
@moduledoc """
Buzzword Cache for the _Multi-Player Buzzword Bingo_ game.
The cache is automatically refreshed every hour.
##### Based on the course [Multi-Player Bingo](https://pragmaticstudio.com/courses/unpacked-bingo) by Mike and Nicole Clark.
"""
alias __MODULE__.Server
@typedoc "A tuple of phrase and points"
@type buzzword :: {phrase, points}
@typedoc "A map assigning points to phrases"
@type buzzwords :: %{phrase => points}
@typedoc "Buzzword phrase"
@type phrase :: String.t()
@typedoc "Buzzword points"
@type points :: pos_integer
@doc """
Returns a map of buzzwords from the cache.
## Examples
iex> alias Buzzword.Cache
iex> %{"Low-Hanging Fruit" => points} = Cache.get_buzzwords()
iex> points
300
"""
@spec get_buzzwords :: buzzwords
def get_buzzwords, do: GenServer.call(Server, :get_buzzwords)
@doc """
Refreshes the cache from the configured external file and resets the timer.
"""
@spec refresh :: :refresh
def refresh, do: send(Server, :refresh)
end