lib/sptfy/object/playback.ex

defmodule Sptfy.Object.Playback do
  @moduledoc """
  Module for playback state struct.
  """

  use Sptfy.Object

  alias Sptfy.Object.{Context, Device, FullEpisode, FullTrack}

  defstruct ~w[
    device
    shuffle_state
    repeat_state
    timestamp
    context
    progress_ms
    item
    currently_playing_type
    is_playing
  ]a

  def new(fields) do
    fields =
      fields
      |> Helpers.atomize_keys()
      |> Map.update(:device, nil, &Device.new/1)
      |> Map.update(:context, nil, &Context.new/1)
      |> Map.update(:item, nil, &build_item/1)

    struct(__MODULE__, fields)
  end

  defp build_item(fields = %{"type" => "track"}), do: FullTrack.new(fields)
  defp build_item(fields = %{"type" => "episode"}), do: FullEpisode.new(fields)
end