public ActionResult EnterResults(RaceResultsViewModel viewModel)
 {
     bool created = false;
     viewModel.SubmittedOn = DateTime.Now;
     Mapper.CreateMap<ViewModels.RaceResultsViewModel, Models.RaceResult>();
     var raceResult = Mapper.Map<ViewModels.RaceResultsViewModel, Models.RaceResult>(viewModel);
     raceResult.ApprovedBy = null;
     raceResult.ApprovedOn = null;
     raceResult.ModifiedBy = null;
     raceResult.ModifiedOn = null;
     var raceResultID = raceResultsService.CreateRaceResult(raceResult);
     if (raceResultID > 0)
         created = true;
     return Json(new { Created = created }, JsonRequestBehavior.AllowGet);
 }
        public ActionResult RaceResults(RaceResultsViewModel viewModel)
        {
            try
            {
                var regionalResults = new List<RegionResultViewModel>();
                var overallResults = new RegionResultViewModel();

                //get all results for the given race
                var allRegionsResults = raceResultsService.GetAggregatedRaceResults(viewModel.RaceID, null).ToList();
                var regions = raceResultsService.GetRegions().Where(r => r.TopLevel == true).ToList(); //get all toplevel regions
                Mapper.CreateMap<Models.AggregatedRaceResult, ViewModels.AggregatedRaceResultViewModel>();
                //get result per region
                foreach (var region in regions)
                {
                    var regionresult = new RegionResultViewModel();
                    regionresult.Region = new RegionViewModel { RegionID = region.RegionID, RegionCode = region.RegionCode, Name = region.Name };
                    regionresult.Results = Mapper.Map<List<Models.AggregatedRaceResult>, List<ViewModels.AggregatedRaceResultViewModel>>
                        (allRegionsResults.Where(rr => rr.RegionCode.ToLower() == region.RegionCode.ToLower()).ToList());
                    regionresult.Winner = regionresult.Results.OrderByDescending(rr => rr.TotalVotes).FirstOrDefault();
                    regionalResults.Add(regionresult);
                }

                // overall results
                // aggregate for all regions
                var aggResults = allRegionsResults.GroupBy(r => r.PartyAcronym)
                                    .Select(r =>
                                        {
                                            AggregatedRaceResult aggregatedRaceResult = r.FirstOrDefault();
                                            return new
                                                         {
                                                             PartyAcronym = r.Key
                                                             , aggregatedRaceResult.RegionID
                                                             , aggregatedRaceResult.RegionCode
                                                             , aggregatedRaceResult.RegionName
                                                             , aggregatedRaceResult.RaceID,
                                                             CandidateID = aggregatedRaceResult.CandidateId, aggregatedRaceResult.FirstName, aggregatedRaceResult.LastName, aggregatedRaceResult.MiddleName, aggregatedRaceResult.PartyName, aggregatedRaceResult.PartyColor,
                                                             TotalVotes = r.Sum(p => p.TotalVotes),
                                                         };
                                        }).ToList();

                overallResults.Results = new List<AggregatedRaceResultViewModel>();
                foreach (var aggResult in aggResults)
                {
                    overallResults.Results.Add(new AggregatedRaceResultViewModel
                    {
                        PartyAcronym = aggResult.PartyAcronym,
                        RegionID = aggResult.RegionID,
                        RegionCode = aggResult.RegionCode,
                        RegionName = aggResult.RegionName,
                        RaceID = aggResult.RaceID,
                        CandidateID = aggResult.CandidateID,
                        TotalVotes = aggResult.TotalVotes.Value,
                        FirstName = aggResult.FirstName,
                        LastName = aggResult.LastName,
                        MiddleName = aggResult.MiddleName,
                        PartyName = aggResult.PartyName,
                        PartyColor = aggResult.PartyColor,
                    });
                }

                var allResults = new RaceResultsViewModel
                {
                    RegionalResults = regionalResults,
                    SelectedRegionResults = string.IsNullOrEmpty(viewModel.RegionCode)
                                            ? overallResults
                                            : regionalResults.FirstOrDefault(rr => rr.Region.RegionCode == viewModel.RegionCode)
                };


                return Json(allResults, JsonRequestBehavior.AllowGet);

            }
            catch (Exception ex)
            {
                return Json(new { Message = ex.Message, StackTrace = ex.StackTrace, InnerException = ex.InnerException.Message });
            }
        }
        public ActionResult ElectionMonitoringRaceResults(string regioncode)
        {
            var results = new List<Models.AggregatedRaceResult>();
            var title = "National results of Presidential Elections";
            //TODO: Rework
            //This reall y should try to get for a particualr region 
            //if region is unknown it should return for whoel country
            if ((string.IsNullOrEmpty(regioncode)) || regioncode =="NGA")
            {
                //get 
                results = raceResultsService.GetAggregatedRaceResults(1 , "").ToList();
                title = "National results of Presidential Elections";
            }
            else
            {
                results = raceResultsService.GetAggregatedRaceResults(1,regioncode).ToList();
                
                title = regioncode +" state results of Presidential Elections";
            }

            if (results.Count < 1)
                title = "No results found";
            
            string[][] data = new string[results.Count][];


            for (int i = 0; i < results.Count; i++)
            {
                var result = results[i];
                var name = result.PartyAcronym + " ("
                    + result.FirstName.Substring(0, 1) + "."
                    + result.LastName + ")";
                name = result.PartyAcronym;
                data[i] = new string[] { name, result.TotalVotes.ToString() };
            }

            var returnValue = new RaceResultsViewModel
            {
                Title = title,
                PieData = data
            };

            return Json(returnValue, JsonRequestBehavior.AllowGet);
        }