package is.idega.idegaweb.golf;
import is.idega.idegaweb.golf.entity.Field;
import is.idega.idegaweb.golf.entity.FieldHome;
import is.idega.idegaweb.golf.entity.Member;
import is.idega.idegaweb.golf.entity.MemberHome;
import is.idega.idegaweb.golf.entity.MemberInfo;
import is.idega.idegaweb.golf.entity.MemberInfoHome;
import is.idega.idegaweb.golf.entity.Scorecard;
import is.idega.idegaweb.golf.entity.Stroke;
import is.idega.idegaweb.golf.entity.Tournament;
import is.idega.idegaweb.golf.entity.TournamentRound;
import is.idega.idegaweb.golf.entity.TournamentRoundHome;
import is.idega.idegaweb.golf.handicap.business.Handicap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;
import javax.ejb.FinderException;
import com.idega.data.IDOLookup;
import com.idega.util.IWTimestamp;
import com.idega.util.text.TextSoap;
public class UpdateHandicap {
public static void update(int member_id) {
try {
Member member = ((MemberHome) IDOLookup.getHomeLegacy(Member.class)).findByPrimaryKey(member_id);
IWTimestamp stampur = new IWTimestamp(1, 1, 2000);
UpdateHandicap.update(member, stampur);
}
catch (FinderException sql) {
sql.printStackTrace(System.err);
}
}
public static void update(int member_id, IWTimestamp stampur) {
try {
Member member = ((MemberHome) IDOLookup.getHomeLegacy(Member.class)).findByPrimaryKey(member_id);
stampur.addDays(-1);
UpdateHandicap.update(member, stampur);
}
catch (FinderException sql) {
sql.printStackTrace(System.err);
}
}
public static void update(Member member, IWTimestamp stampur) {
MemberInfo memberInfo = null;
try {
memberInfo = ((MemberInfoHome) IDOLookup.getHomeLegacy(MemberInfo.class)).findByMember(member);
}
catch (FinderException e1) {
System.out.println("UpdateHandicap : handicapInfo not found for member : " + member.getSocialSecurityNumber());
}
if (memberInfo != null) {
try {
int member_id = member.getID();
TournamentRound round = null;
Field field = null;
Handicap leikForgjof = null;
Vector strokeVector = null;
Stroke[] stroke2 = null;
int leik = 0;
int realLeik = 0;
int heildarpunktar = 0;
int realTotalPoints = 0;
int field_par = 0;
int slope = 0;
float course_rating = 0;
int teeColorID = 0;
int field_id = 0;
int tournamentRoundID = 0;
boolean isTournament = false;
float modifier = -1;
double grunn = (double) memberInfo.getFirstHandicap();
int tee_id = 0;
double tournamentHandicap = 0;
boolean updateHandicap = true;
Scorecard[] scorecardsBefore = (Scorecard[]) ((Scorecard) IDOLookup.instanciateEntity(Scorecard.class)).findAll("select * from scorecard where member_id = "
+ member_id + " and scorecard_date < '" + stampur.toSQLDateString() + "' order by scorecard_date desc");
if (scorecardsBefore.length > 0) {
grunn = (double) scorecardsBefore[0].getHandicapAfter();
}
grunn = Double.parseDouble(TextSoap.singleDecimalFormat(grunn));
Scorecard[] scorecardsNotNull = (Scorecard[]) ((Scorecard) IDOLookup.instanciateEntity(Scorecard.class)).findAll("select * from scorecard where member_id = "
+ member_id
+ " and ( scorecard_date > '"
+ stampur.toSQLDateString()
+ "' or scorecard_date is null ) order by scorecard_date");
Scorecard[] scorecardsNull = (Scorecard[]) ((Scorecard) IDOLookup.instanciateEntity(Scorecard.class)).findAll("select * from scorecard where member_id = "
+ member_id
+ " and scorecard_date is null");
Collection scorecards = new ArrayList();
scorecards.addAll(Arrays.asList(scorecardsNotNull));
scorecards.addAll(Arrays.asList(scorecardsNull));
if (scorecards.size() > 0) {
Iterator iter = scorecards.iterator();
while (iter.hasNext()) {
Scorecard scorecard = (Scorecard) iter.next();
int scorecardID = scorecard.getID();
round = ((TournamentRoundHome) IDOLookup.getHomeLegacy(TournamentRound.class)).findByPrimaryKey(scorecard.getTournamentRoundId());
if (scorecard.getForeignRound()) {
scorecard.setHandicapBefore((float) grunn);
grunn = reiknaHandicap2(member, (double) grunn, scorecard.getTotalPoints());
scorecard.setHandicapAfter((float) grunn);
}
else {
if (!scorecard.getHandicapCorrection()) {
if ((scorecard.getScorecardDate() == null && scorecard.getUpdateHandicap()) || (scorecard.getTotalPoints() == 0 && scorecard.getScorecardDate() != null)) {
scorecard.setScorecardDate(null);
scorecard.setUpdateHandicap(false);
}
slope = scorecard.getSlope();
course_rating = scorecard.getCourseRating();
teeColorID = scorecard.getTeeColorID();
field_id = scorecard.getFieldID();
tournamentRoundID = scorecard.getTournamentRoundId();
isTournament = false;
if (tournamentRoundID > 1) {
isTournament = true;
}
updateHandicap = scorecard.getUpdateHandicap();
stroke2 = (Stroke[]) ((Stroke) IDOLookup.instanciateEntity(Stroke.class)).findAll("select s.* from stroke s,tee t where s.tee_id = t.tee_id and s.scorecard_id = "
+ scorecardID + " order by t.hole_number");
strokeVector = new Vector(stroke2.length);
for (int i = 0; i < stroke2.length; i++)
strokeVector.add(stroke2[i]);
field_par = getFieldPar(strokeVector);
if (field_par == 0) {
field = ((FieldHome) IDOLookup.getHomeLegacy(Field.class)).findByPrimaryKey(field_id);
field_par = field.getFieldPar();
}
leikForgjof = new Handicap(grunn);
if (isTournament) {
if (round.getRoundNumber() == 1) {
tournamentHandicap = grunn;
}
float tournamentPlayHandicap = (float) leikForgjof.getLeikHandicap(slope, course_rating, field_par);
Tournament tournament = round.getTournament();
modifier = tournament.getTournamentType().getModifier();
if (member.getGender().equalsIgnoreCase("m")) {
if (tournamentPlayHandicap > tournament.getMaxHandicap()) {
tournamentHandicap = leikForgjof.getHandicapForScorecard(tournament.getID(), teeColorID,
tournament.getMaxHandicap());
}
}
else if (member.getGender().equalsIgnoreCase("f")) {
if (tournamentPlayHandicap > tournament.getFemaleMaxHandicap()) {
tournamentHandicap = leikForgjof.getHandicapForScorecard(tournament.getID(), teeColorID,
tournament.getFemaleMaxHandicap());
}
}
leikForgjof = new Handicap((double) tournamentHandicap);
if (modifier != -1) {
int modified = leikForgjof.getLeikHandicap((double) slope, (double) course_rating,
(double) field_par);
int modifiedHandicap = Math.round((float) modified * modifier);
tournamentHandicap = leikForgjof.getHandicapForScorecard(tournament.getID(), teeColorID,
modifiedHandicap);
leikForgjof = new Handicap((double) tournamentHandicap);
}
}
leik = leikForgjof.getLeikHandicap((double) slope, (double) course_rating, (double) field_par);
realLeik = new Handicap(grunn).getLeikHandicap((double) slope, (double) course_rating,
(double) field_par);
heildarpunktar = 0;
realTotalPoints = 0;
Handicap handicap = Handicap.getInstance();
heildarpunktar = handicap.calculatePoints(scorecard, strokeVector, leik);
if (isTournament) {
scorecard.setHandicapBefore((float) tournamentHandicap);
realTotalPoints = handicap.calculatePointsWithoutUpdate(stroke2, realLeik);
}
else {
scorecard.setHandicapBefore((float) grunn);
}
if (!updateHandicap && realTotalPoints > 36 && round.getDecreaseHandicap()) {
updateHandicap = true;
}
if (updateHandicap) {
if (isTournament) {
grunn = reiknaHandicap2(member, (double) grunn, realTotalPoints);
}
else {
grunn = reiknaHandicap2(member, (double) grunn, heildarpunktar);
}
scorecard.setHandicapAfter((float) grunn);
}
else {
scorecard.setHandicapAfter((float) grunn);
}
}
else {
scorecard.setHandicapBefore((float) grunn);
grunn = (double) scorecard.getHandicapAfter();
}
}
scorecard.update();
}
}
memberInfo.setHandicap((float) grunn);
memberInfo.update();
}
catch (Exception e) {
e.printStackTrace(System.err);
}
}
}
public static double reiknaHandicap2(Member member, double grunn, int heildarpunktar) {
double nyForgjof = 0;
try {
double breyting;
if (heildarpunktar >= 0) {
breyting = heildarpunktar - 36;
}
else {
breyting = 0.0;
}
Handicap forgjof = new Handicap(grunn);
nyForgjof = forgjof.getNewHandicap(breyting);
if (member.getGender().equalsIgnoreCase("f")) {
if (nyForgjof > 40.0) {
nyForgjof = 40.0;
}
}
else if (member.getGender().equalsIgnoreCase("m")) {
if (nyForgjof > 36.0) {
nyForgjof = 36.0;
}
}
}
catch (Exception e) {
e.printStackTrace(System.out);
}
nyForgjof = Double.parseDouble(TextSoap.singleDecimalFormat(nyForgjof));
return nyForgjof;
}
public static String reiknaHandicap(Member member, double grunn, int heildarpunktar) {
double nyForgjof = reiknaHandicap2(member, grunn, heildarpunktar);
return Double.toString(nyForgjof);
}
private static int getFieldPar(Vector vector) {
if (vector != null) {
int par = 0;
Iterator iter = vector.iterator();
while (iter.hasNext()) {
Stroke item = (Stroke) iter.next();
par += item.getHolePar();
}
if (vector.size() == 9)
par = par * 2;
else if (vector.size() < 18)
par = 0;
return par;
}
return 0;
}
}