class W3DHub
  class Api
    class Applications
      def initialize(response)
        @data = JSON.parse(response, symbolize_names: true)

        games = @data[:applications].select { |a| a[:category] == "games" }

        @games = []

        games.each { |hash| @games << Game.new(hash) }
        @games.sort_by! { |a| a.name }.reverse
      end

      def games
        @games
      end

      class Game
        attr_reader :id, :name, :type, :category, :studio_id, :channels, :web_links, :color

        def initialize(hash)
          @data = hash

          @id = @data[:id]
          @name = @data[:name]
          @type = @data[:type]
          @category = @data[:category]
          @studio_id = @data[:"studio-id"]

           # TODO: Do processing
          @channels = @data[:channels].map { |channel| Channel.new(channel) }
          @web_links = @data[:"web-links"]&.map { |link| WebLink.new(link) } || []
          @extended_data = @data[:"extended-data"]

          color = @data[:"extended-data"].find { |h| h[:name] == "colour" }[:value].sub("#", "")

          @color = "ff#{color}".to_i(16)
        end

        class Channel
          attr_reader :id, :name, :user_level, :current_version

          def initialize(hash)
            @data = hash

            @id = @data[:id]
            @name = @data[:name]
            @user_level = @data[:"user-level"]
            @current_version = @data[:"current-version"]
          end
        end

        class WebLink
          attr_reader :name, :uri

          def initialize(hash)
            @data = hash

            @name = hash[:name]
            @uri  = hash[:uri]
          end
        end
      end
    end
  end
end
