module NYTimes
	module Congress
		class Congress < Base
		  attr_reader :number, :session, :chamber
		  
		  include AttributeTransformation
      
      def initialize(number, chamber, session = nil)
        @number, @session = integer_for(number), integer_for(session)
        @chamber = symbol_for(chamber)
        raise AttributeError unless number && chamber
      end
      
      def members(params = {})        
        @members ||= fetch_members(Base.invoke("#{api_path}/members.json")['results'].first['members'])
      end
      
      def self.new_members(params = {})
        Congress.fetch_new_members
      end
      
      def current_member_for_state_district(state, district=nil)
        if district
          api_path = "members/house/#{state}/#{district}/current.json"
        else
          api_path = "members/senate/#{state}/current.json"
        end
        response = Base.invoke(api_path)['results']
        fetch_current_members(response)
      end
      
      def roll_call_vote(session_number, roll_call_number, params = {})
        results = Base.invoke("#{api_path}/sessions/#{session_number}/votes/#{roll_call_number}.json")['results']['votes']
        RollCallVote.new(results)
      end
      
      def to_s
        "#{number} #{chamber.upcase}"
      end
      
      def compare(legislator_1, legislator_2)
        response = Base.invoke("members/#{legislator_1}/compare/#{legislator_2}/#{number}/#{chamber}.json")
        if response 
          LegislatorVoteComparison.new(response['results'].first)
        end
      end
      
      def votes(type)
        members = fetch_members_by_type(Base.invoke("#{number}/#{chamber}/votes/#{type}.json")['results'].first['members'])
      end
      
      protected
      
      def fetch_members(results)
  			results.inject({}) do |hash, member| 
  			  hash[member['id']] = Legislator.new(member)
  			  hash
  			end
      end

      def fetch_current_members(results)
    		results.inject({}) do |hash, member|
    			hash[member['id']] = CurrentMember.new(member)
    			hash
    		end
      end
      
      def fetch_members_by_type(results)
        h = Hash.new
  			results.each do |member|
  			  h[member['id']] = MemberVoteType.new(member)
  			  h
  			end
      end

      def self.fetch_new_members
        results = Base.invoke("/members/new.json")['results'].first
  			results['members'].inject({}) do |hash, member|
  			  hash[member['id']] = Legislator.new(member)
  			  hash
  			end
      end
      
      def api_path
        "#{number}/#{chamber}"
      end        
    end
    
  end
end