Clone
defmodule PiDay.Game.Player do
  use Ecto.Schema
  import Ecto.Changeset

  @primary_key {:id, :binary_id, autogenerate: true}
  @foreign_key_type :binary_id

  schema "players" do
    field :name, :string
    field :avatar_key, :string
    field :session_token, :string
    field :total_score, :integer, default: 0

    has_many :game_scores, PiDay.Game.Score

    timestamps(type: :utc_datetime)
  end

  @avatars ~w(pi sigma delta omega theta lambda phi psi epsilon zeta)

  def avatars, do: @avatars

  def changeset(player, attrs) do
    player
    |> cast(attrs, [:name, :avatar_key])
    |> validate_required([:name, :avatar_key])
    |> validate_length(:name, min: 1, max: 20)
    |> validate_inclusion(:avatar_key, @avatars)
    |> put_session_token()
  end

  defp put_session_token(changeset) do
    if get_field(changeset, :session_token) do
      changeset
    else
      put_change(changeset, :session_token, generate_token())
    end
  end

  defp generate_token do
    :crypto.strong_rand_bytes(32) |> Base.url_encode64(padding: false)
  end
end