-
Notifications
You must be signed in to change notification settings - Fork 0
/
ElectionManager.cs
156 lines (143 loc) · 6.37 KB
/
ElectionManager.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
using MsgLib;
using MsgLib.Msg;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FileProcessService
{
public class ElectionManager
{
private Dictionary<string, CandidateDetails> m_Candidates = new Dictionary<string, CandidateDetails>();
private Dictionary<string, Dictionary<string, VotesDetails>> m_Votes = new Dictionary<string, Dictionary<string, VotesDetails>>();
public void HandleCandidateDetails(MsgBase msg)
{
CandidateDetails candidate = msg as CandidateDetails;
if (!m_Candidates.ContainsKey(candidate.CandidateUID))
m_Candidates.Add(candidate.CandidateUID, candidate);
}
public void HandleVotes(MsgBase msg)
{
VotesDetails vote = msg as VotesDetails;
if (!m_Votes.ContainsKey(vote.State))
{
m_Votes.Add(vote.State, new Dictionary<string, VotesDetails>());
}
if (!m_Votes[vote.State].ContainsKey(vote.CandidateId))
m_Votes[vote.State].Add(vote.CandidateId, vote);
else
m_Votes[vote.State][vote.CandidateId] = vote;
}
public List<MsgBase> HandleResoultRequest(MsgBase msg)
{
List<MsgBase> results = new List<MsgBase>();
ElectionResultsRequest resultsRequest = msg as ElectionResultsRequest;
if (resultsRequest.State == "")
{
ElectionResults result = new ElectionResults()
{
RequestUID = resultsRequest.Base_MsgUID,
Election = resultsRequest.ElectionID,
State = ""
};
Dictionary<string, VotingResult> summaryResults = new Dictionary<string, VotingResult>();
foreach (var state in m_Votes)
{
foreach (VotesDetails votes in state.Value.Values)
{
if (summaryResults.ContainsKey(votes.CandidateId))
{
summaryResults[votes.CandidateId].VoteCount += votes.VoteCount;
summaryResults[votes.CandidateId].ElectoralVotesWon += votes.ElectoralVotesWon;
}
else
{
CandidateDetails candidate = m_Candidates[votes.CandidateId];
VotingResult vResult = new VotingResult()
{
CandidateId = votes.CandidateId,
CandidateFirstName = candidate.FirstName,
CandidateLastName = candidate.LastName,
Party = candidate.Party,
ElectoralVotes = 348,
ElectoralVotesWon = votes.ElectoralVotesWon,
VoteCount = votes.VoteCount,
FinalResults = false
};
summaryResults.Add(vResult.CandidateId, vResult);
}
}
}
int allVotes = summaryResults.Values.Sum(v => v.VoteCount);
foreach (VotingResult vote in summaryResults.Values)
{
vote.VotePercent = (vote.VoteCount / allVotes) * 100;
result.Voting.Add(vote);
}
results.Add(result);
}
else if (resultsRequest.State == "All")
{
foreach (var state in m_Votes)
{
ElectionResults result = new ElectionResults()
{
RequestUID = resultsRequest.Base_MsgUID,
Election = resultsRequest.ElectionID,
State = state.Key
};
foreach (VotesDetails votes in state.Value.Values)
{
CandidateDetails candidate = m_Candidates[votes.CandidateId];
result.Voting.Add(new VotingResult()
{
CandidateId = votes.CandidateId,
CandidateFirstName = candidate.FirstName,
CandidateLastName = candidate.LastName,
Party = candidate.Party,
ElectoralVotes = votes.ElectoralVotes,
ElectoralVotesWon = votes.ElectoralVotesWon,
VoteCount = votes.VoteCount,
VotePercent = votes.VotePercent,
FinalResults = votes.FinalResults
});
}
results.Add(result);
}
}
else
{
if (m_Votes.ContainsKey(resultsRequest.State))
{
ElectionResults result = new ElectionResults()
{
RequestUID = resultsRequest.Base_MsgUID,
Election = resultsRequest.ElectionID,
State = resultsRequest.State
};
foreach (VotesDetails votes in m_Votes[resultsRequest.State].Values)
{
CandidateDetails candidate = m_Candidates[votes.CandidateId];
result.Voting.Add(new VotingResult()
{
CandidateId = votes.CandidateId,
CandidateFirstName = candidate.FirstName,
CandidateLastName = candidate.LastName,
Party = candidate.Party,
ElectoralVotes = votes.ElectoralVotes,
ElectoralVotesWon = votes.ElectoralVotesWon,
VoteCount = votes.VoteCount,
VotePercent = votes.VotePercent,
FinalResults = votes.FinalResults
});
}
results.Add(result);
}
else
results.Add(new ElectionResults());
}
return results;
}
}
}