beneggett/sportradar-api

View on GitHub
lib/sportradar/api/football/team.rb

Summary

Maintainability
C
7 hrs
Test Coverage
module Sportradar
  module Api
    module Football
      class Team < Data
        attr_accessor :response, :id, :market, :name, :alias, :full_name, :venue, :records, :player_stats, :team_stats, :seed, :season, :type, :stats, :used_timeouts, :remaining_timeouts

        def initialize(data, **opts)
          @response = data
          @api      = opts[:api]

          @games_hash   = {}
          @players_hash = {}
          @player_stats = {}
          @records      = {}
          @stats        = nil
          @points       = nil

          case data
          when String
            @id = data
          when Hash
            @id = data['id']
            update(data, **opts)
          end
        end

        def update(data, **opts)
          handle_names(data)
          @id = data['id'] || @id

          @venue    = Venue.new(data['venue']) if data['venue']

          @seed     = data['seed'].to_i             if data['seed']
          @alias    = data['alias']                 if data['alias']
          @points   = data['points'].to_i           if data['points'] && data['points'].kind_of?(Integer)
          @used_timeouts      = data['used_timeouts']       if data['used_timeouts']
          @remaining_timeouts = data['remaining_timeouts']  if data['remaining_timeouts']

          parse_records(data)                                          if data['records'] || data['overall']
          parse_players(data.dig('players'), opts[:game])   if data.dig('players')
          # parse_stats(data['statistics'])                             if data['statistics']
          if opts[:game]
            add_game(opts[:game])
            opts[:game].update_score(id => @points)             if @points
            if data['statistics']
              @stats = Sportradar::Api::Football::GameStats.new(data['statistics'])
              opts[:game].update_stats(self, @stats)
            end
          end
        end

        def timeouts
          {'used' => used_timeouts, 'remaining' => remaining_timeouts}
        end
        def handle_names(data)
          # need to do some more work here
          @name = data['name'] if data['name']
          if data['name'] && !data.key?('market')
            @full_name = data['name']
          elsif data['name'] && data['market']
            @market = data['market']
            @full_name = [@market, data['name']].join(' ')
          end
        end

        def record(type = 'overall')
          @records[type]
        end

        def games
          @games_hash.values
        end
        def add_game(game)
          @games_hash[game.id] = game.id if game
        end

        # def parse_stats(data)
        #   @stats = data
        # end

        def players
          get_roster if @players_hash.empty?
          @players_hash.values
        end
        alias :roster :players
        def parse_players(data, game)
          create_data(@players_hash, data, klass: player_class, api: api, team: self, game: game)
        end
        def update_player_stats(player, stats, game = nil)
          game ? game.update_player_stats(player, stats) : @player_stats.merge!(player.id => stats.merge(player: player))
        end

        def get_roster
          data = api.get_data(path_roster).to_h
          ingest_roster(data)
        end
        def ingest_roster(data)
          update(data)
          data
        end
        def queue_roster
          url, headers, options, timeout = api.get_request_info(path_roster)
          {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_roster)}
        end


        def get_season_stats(year = default_year)
          data = api.get_data(path_season_stats(year)).to_h
          ingest_season_stats(data)
        end
        def ingest_season_stats(data)
          parse_season_stats(data)
        end

        # def ingest_season_stats(data)
        #   update(data, source: :teams)
        #   data
        # end

        def queue_season_stats(year = default_year)
          url, headers, options, timeout = api.get_request_info(path_season_stats(year))
          {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_season_stats)}
        end

        def parse_records(data)
          @records['overall'] = Record.new(data, type: 'overall')
          data['records'].each { |record| @records[record['record_type']] = Record.new(record, type: record['record_type']) }
        end

        def parse_season_stats(data)
          @team_stats = data.dig('statistics')
          update(data)
          player_data = data.dig('players')
          create_data(@players_hash, player_data, klass: player_class, api: api, team: self)
          data
        end

        def path_base
          "teams/#{ id }"
        end
        def path_base_stats(year = season_year, season = default_season)
          "seasons/#{year}/#{season}/teams/#{id}"
        end
        def path_roster
          "#{ path_base }/profile" # nfl is profile, ncaa is roster
        end
        def path_season_stats(year = season_year, season = default_season)
          "#{ path_base_stats(year, season) }/statistics"
        end


        def season_year
          @season || default_year
        end
        alias :year :season_year

        private
        def default_year
          (Date.today - 60).year
        end
        def default_date
          Date.today
        end
        def default_season
          'reg'
        end

      end
    end
  end
end