public async Task <IReadOnlyCollection <Contracts.CurrentMember> > GetCurrentMembersAsync(Chamber chamber, string state, int?district = null)
        {
            if (chamber == Chamber.Unknown)
            {
                throw new ArgumentException("Chamber must be 'House' or 'Senate'.");
            }

            if (String.IsNullOrWhiteSpace(state))
            {
                throw new ArgumentNullException("state", "State is required.");
            }

            string url = apiBaseUrl;

            if (district.HasValue)
            {
                url += String.Format(currentHouseMembersUrl, chamber.ToString().ToLower(), state, district);
            }
            else
            {
                url += String.Format(currentMembersUrl, chamber.ToString().ToLower(), state);
            }

            var internalModel = await GetMultipleResultDataAsync <InternalModels.CurrentMember>(url);

            var contract = AutoMapperConfiguration.Mapper.Map <IReadOnlyCollection <InternalModels.CurrentMember>, IReadOnlyCollection <Contracts.CurrentMember> >(internalModel.Results);

            return(contract);
        }
        public async Task <Contracts.CommitteesContainer> GetCommitttees(int congress, Chamber chamber)
        {
            string url = apiBaseUrl + String.Format(committeesUrl, congress, chamber.ToString().ToLower());

            var internalModel = await GetMultipleResultDataAsync <InternalModels.CommitteesContainer>(url);

            var contract = AutoMapperConfiguration.Mapper.Map <
                InternalModels.CommitteesContainer,
                Contracts.CommitteesContainer>(internalModel.Results.ElementAt(0));

            return(contract);
        }
        public async Task <Contracts.SpecificCommittee> GetSpecificCommittee(int congress, Chamber chamber, string committeeId)
        {
            string url = apiBaseUrl + String.Format(specificCommitteeUrl, congress, chamber.ToString().ToLower(), committeeId);

            var internalModel = await GetMultipleResultDataAsync <InternalModels.SpecificCommittee>(url);

            var contract = AutoMapperConfiguration.Mapper.Map <
                InternalModels.SpecificCommittee,
                Contracts.SpecificCommittee>(internalModel.Results.ElementAt(0));

            return(contract);
        }
        public async Task <Contracts.RollCallVote> GetSpecificRollCallVote(int congress, Chamber chamber, Session session, int rollCallNumber)
        {
            string url = apiBaseUrl + String.Format(voteRollCallUrl, congress, chamber.ToString().ToLower(), (int)session, rollCallNumber);

            var internalModel = await GetSingleResultDataAsync <InternalModels.RollCallVotesContainer>(url);

            var contract = AutoMapperConfiguration.Mapper.Map <
                InternalModels.RollCallVotesContainer,
                Contracts.RollCallVotesContainer>(internalModel.Results);

            return(contract.Votes.Vote);
        }
        public async Task <Contracts.VoteByTypeContainer> GetVotesByType(int congress, Chamber chamber, VoteAggregateCategory voteType)
        {
            string url = apiBaseUrl + String.Format(votesByTypeUrl, congress, chamber.ToString().ToLower(), voteType.ToString().ToLower());

            var internalModel = await GetMultipleResultDataAsync <InternalModels.VoteByTypeContainer>(url);

            var contract = AutoMapperConfiguration.Mapper.Map <
                InternalModels.VoteByTypeContainer,
                Contracts.VoteByTypeContainer>(internalModel.Results.ElementAt(0));

            return(contract);
        }
        public async Task <Contracts.VoteByDateContainer> GetVotesByDate(Chamber chamber, int year, int month)
        {
            string url = apiBaseUrl + String.Format(votesByDateUrl, chamber.ToString().ToLower(), year, month);

            var internalModel = await GetSingleResultDataAsync <InternalModels.VoteByDateContainer>(url);

            var contract = AutoMapperConfiguration.Mapper.Map <
                InternalModels.VoteByDateContainer,
                Contracts.VoteByDateContainer>(internalModel.Results);

            return(contract);
        }
        /// <summary>
        /// Returns a collection of members in whatever Congress and Chamber (House or Senate) is passed as parameters. Use the MemberUrl in the response to get more details about a specific member.
        /// </summary>
        /// <param name="congress">Number of Congress to query (ie. 2017 is the 115th Congress).</param>
        /// <param name="chamber">Chamber of Congress such as "house" or "senate".</param>
        /// <returns></returns>
        public async Task <Contracts.MembersContainer> GetMembersAsync(int congress, Chamber chamber)
        {
            if (chamber == Chamber.Unknown)
            {
                throw new ArgumentException("Chamber must be 'House' or 'Senate'.");
            }

            string url = apiBaseUrl + String.Format(membersUrl, congress, chamber.ToString().ToLower());

            var internalModel = await GetMultipleResultDataAsync <InternalModels.MembersContainer>(url);

            var contract = AutoMapperConfiguration.Mapper.Map <InternalModels.MembersContainer, Contracts.MembersContainer>(internalModel.Results.ElementAt(0));

            return(contract);
        }
        public async Task <Contracts.RecentBillsContainer> GetRecentBills(int congress, Chamber chamber, RecentBillType billType, int?offset = null)
        {
            string url = apiBaseUrl + String.Format(recentBillsUrl, congress, chamber.ToString().ToLower(), billType.ToString().ToLower());

            // we can offset the results to page through them since this endpoint only returns 20 at a time
            if (offset.HasValue && offset.Value > 0)
            {
                url += String.Format(offsetParameter, offset.Value);
            }

            var internalModel = await GetMultipleResultDataAsync <InternalModels.RecentBillsContainer>(url);

            var contract = AutoMapperConfiguration.Mapper.Map <
                InternalModels.RecentBillsContainer,
                Contracts.RecentBillsContainer>(internalModel.Results.ElementAt(0));

            return(contract);
        }
        public async Task <IReadOnlyCollection <MemberVoteComparison> > CompareMemberVotes(string firstMemberId, string secondMemberId, int congress, Chamber chamber)
        {
            if (String.IsNullOrWhiteSpace(firstMemberId))
            {
                throw new ArgumentNullException("firstMemberId", "First Member ID is required.");
            }

            if (String.IsNullOrWhiteSpace(secondMemberId))
            {
                throw new ArgumentNullException("secondMemberId", "Second Member ID is required.");
            }

            string url = apiBaseUrl + String.Format(compareMemberVotesUrl, firstMemberId, secondMemberId, congress, chamber.ToString().ToLower());

            var internalModel = await GetMultipleResultDataAsync <InternalModels.MemberVoteComparison>(url);

            var contract = AutoMapperConfiguration.Mapper.Map <IReadOnlyCollection <InternalModels.MemberVoteComparison>, IReadOnlyCollection <Contracts.MemberVoteComparison> > (internalModel.Results);

            return(contract);
        }
        public async Task <Contracts.MemberBillSponsorshipComparisonContainer> CompareMemberBillSponsorships(string firstMemberId, string secondMemberId, int congress, Chamber chamber)
        {
            if (String.IsNullOrWhiteSpace(firstMemberId))
            {
                throw new ArgumentNullException("firstMemberId", "First Member ID is required.");
            }

            if (String.IsNullOrWhiteSpace(secondMemberId))
            {
                throw new ArgumentNullException("secondMemberId", "Second Member ID is required.");
            }

            string url = apiBaseUrl + String.Format(compareMemberBillSponsorshipsUrl, firstMemberId, secondMemberId, congress, chamber.ToString().ToLower());

            var internalModel = await GetMultipleResultDataAsync <InternalModels.MemberBillSponsorshipComparisonContainer>(url);

            var contract = AutoMapperConfiguration.Mapper.Map <
                InternalModels.MemberBillSponsorshipComparisonContainer,
                Contracts.MemberBillSponsorshipComparisonContainer>(internalModel.Results.ElementAt(0));

            return(contract);
        }