package com.rau.evoting.beans;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.mail.MessagingException;
import com.rau.evoting.ElGamal.ElGamalHelper;
import com.rau.evoting.data.ElectionDP;
import com.rau.evoting.data.ElectionTrusteeDP;
import com.rau.evoting.data.ElectionVoterDP;
import com.rau.evoting.data.ElectionAnswerDP;
import com.rau.evoting.data.SqlDataProvider;
import com.rau.evoting.models.Answer;
import com.rau.evoting.models.Election;
import com.rau.evoting.models.Trustee;
import com.rau.evoting.models.UserGroup;
import com.rau.evoting.utils.MailService;
import com.rau.evoting.utils.Util;
import com.restfb.types.Group;
public class OpenElection {
private Election election;
private ArrayList<Answer> answers;
private ArrayList<Trustee> trustees;
private String trusteeEmail;
private String answer;
private boolean showRemove;
private boolean canOpen;
private String openningMessage;
private String selectedGroup;
private String selectedVoteMode;
private List<UserGroup> groups;
private String accessToken;
public OpenElection() {
// trustees = new ArrayList<Trustee>();
// selectedVoteMode = "all";
// answers = new ArrayList<Answer>();
accessToken = (String) FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get("accessToken");
}
public String navigateAnswers() {
answers = ElectionAnswerDP.getElectionAnswers(election.getId());
answer = "";
return "Answers?faces-redirect=true";
}
public String navigateTrustees() {
return "Trustees?faces-redirect=true";
}
public String createElection(String name, String description) {
int userId = (int) FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get("userId");
int elId = ElectionDP
.insert(new Election(0, name, description), userId);
election = new Election(elId, name, description);
answers = new ArrayList<Answer>();
trustees = new ArrayList<Trustee>();
selectedVoteMode = "all";
selectedGroup = null;
return "next";
}
public void addAnswer(AjaxBehaviorEvent even) {
if (!answer.equals("")) {
answers.add(new Answer(answers.size() + 1, answer));
answer = "";
}
return;
}
public void removeAnswer(AjaxBehaviorEvent even) {
if (answers.size() > 0) {
answers.remove(answers.size() - 1);
}
answer = "";
return;
}
public String cancelAnswers() {
return "OpenElection?faces-redirect=true";
}
public String addAnswers() {
ElectionAnswerDP.insertAnswers(election.getId(), answers);
return "OpenElection?faces-redirect=true";
}
public String addTrustee() {
if (trusteeEmail.equals(""))
return "";
for (Trustee trustee : trustees) {
if (trustee.getEmail().equals(trusteeEmail))
return "";
}
String message = "Hello, you are chosen trustee for "
+ election.getName()
+ " election\n Please, generate your key: \n";
String token = Util.generateRandomToken();
int trId = ElectionTrusteeDP.insertTrustee(election.getId(),
new Trustee(0, trusteeEmail, false, token, false, trustees.size() + 1));
String url = "http://localhost:8080/Evoting/TrusteeHome.xhtml?trId="
+ trId + "&token=" + token;
String encodedUrl = url;
try {
encodedUrl = URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
message += url; // or encoded
try {
MailService.sendMessage(trusteeEmail,
"Trustee for " + election.getName() + " election", message);
} catch (MessagingException e) {
e.printStackTrace();
ElectionTrusteeDP.deleteTrustee(trId);
}
trusteeEmail = "";
return "Trustees?faces-redirect=true";
}
public String setElection(int id) {
election = ElectionDP.getElection(id);
answers = ElectionAnswerDP.getElectionAnswers(election.getId());
trustees = ElectionTrusteeDP.getElectionTrustees(election.getId());
selectedGroup = ElectionVoterDP.getElectionVoterByGroup(election
.getId());
if (selectedGroup == null) {
selectedVoteMode = "all";
} else {
selectedVoteMode = "";
}
return "OpenElection?faces-redirect=true";
}
public String open() {
String pbKey = ElGamalHelper.getElectionPublicKey(ElectionTrusteeDP
.getElectionTrusteesPublicKeys(election.getId()));
ElectionDP.openElection(election.getId(), pbKey);
return "Elections?faces-redirect=true";
}
public String fromVoters() {
ElectionVoterDP.deleteElectionVoters(election.getId());
if (!selectedVoteMode.equals("all")) {
ElectionVoterDP.setElectionVotersByGroup(election.getId(),
selectedGroup);
}
return "OpenElection?faces-redirect=true";
}
public Election getElection() {
return election;
}
public void setElection(Election election) {
this.election = election;
}
public ArrayList<Answer> getAnswers() {
return answers;
}
public void setAnswers(ArrayList<Answer> answers) {
this.answers = answers;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
public ArrayList<Trustee> getTrustees() {
trustees = ElectionTrusteeDP.getElectionTrustees(election.getId()); // fix
return trustees;
}
public void setTrustees(ArrayList<Trustee> trustees) {
this.trustees = trustees;
}
public String getTrusteeEmail() {
return trusteeEmail;
}
public void setTrusteeEmail(String trusteeEmail) {
this.trusteeEmail = trusteeEmail;
}
public String getSelectedGroup() {
return selectedGroup;
}
public void setSelectedGroup(String selectedGroup) {
this.selectedGroup = selectedGroup;
}
public String getSelectedVoteMode() {
return selectedVoteMode;
}
public void setSelectedVoteMode(String selectedVoteMode) {
this.selectedVoteMode = selectedVoteMode;
}
public List<UserGroup> getGroups() {
// FacebookClient fbClient = new DefaultFacebookClient(accessToken);
// Connection<Group> gr = fbClient.fetchConnection("me/groups",
// Group.class);
// groups = gr.getData();
groups = (List<UserGroup>) FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get("userGroups");
return groups;
}
public void setGroups(ArrayList<UserGroup> groups) {
this.groups = groups;
}
public boolean isShowRemove() {
return answers.size() > 0;
}
public void setShowRemove(boolean showRemove) {
this.showRemove = showRemove;
}
public boolean isCanOpen() {
boolean allGenerated = true;
for (Trustee tr : trustees) {
allGenerated &= tr.isGenerated();
if (!allGenerated)
break;
}
canOpen = allGenerated & (answers.size() > 0);
return canOpen;
}
public void setCanOpen(boolean canOpen) {
this.canOpen = canOpen;
}
public String getOpenningMessage() {
boolean allGenerated = true;
for (Trustee tr : trustees) {
allGenerated &= tr.isGenerated();
if (!allGenerated)
break;
}
if (answers.size() == 0) {
openningMessage = "You have no answers ";
if (!allGenerated) {
openningMessage += "and not all trustees generate their keys.";
}
} else if (!allGenerated) {
openningMessage = "Not all trustees generated their keys.";
}
return openningMessage;
}
public void setOpenningMessage(String openningMessage) {
this.openningMessage = openningMessage;
}
}