com.boha.golfkids.util.NewGolfGroupUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.boha.golfkids.util.NewGolfGroupUtil.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.boha.golfkids.util;

import com.boha.golfkids.data.Club;
import com.boha.golfkids.data.ClubCourse;
import com.boha.golfkids.data.GolfGroup;
import com.boha.golfkids.data.GolfGroupPlayer;
import com.boha.golfkids.data.LeaderBoard;
import com.boha.golfkids.data.Player;
import com.boha.golfkids.data.Scorer;
import com.boha.golfkids.data.Tournament;
import com.boha.golfkids.data.TourneyScoreByRound;
import com.boha.golfkids.dto.LeaderBoardDTO;
import com.boha.golfkids.dto.PlayerDTO;
import com.boha.golfkids.dto.RequestDTO;
import com.boha.golfkids.dto.ResponseDTO;
import com.boha.golfkids.dto.TournamentDTO;
import java.io.File;
import java.io.IOException;
import java.nio.file.CopyOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.Query;
import org.joda.time.DateTime;
import org.joda.time.LocalDateTime;
import org.joda.time.Years;

/**
 *
 * @author aubreyM
 */
public class NewGolfGroupUtil {

    public static final int GENDER_BOYS = 1, GENDER_GIRLS = 2;
    public static final int PECANWOOD = 314, PROVINCE = 16;
    static final Logger log = Logger.getLogger("NewGolfGroupUtil");

    public static void generate(GolfGroup gg, DataUtil dataUtil, PlatformUtil platformUtil) throws DataException {
        List<Player> pList = generatePlayers(gg, dataUtil);
        Club club = dataUtil.getClubByID(PECANWOOD);
        if (club == null) {
            Query q = dataUtil.em.createNamedQuery("Club.findByProvince", Club.class);
            q.setParameter("id", PROVINCE);
            List<Club> cList = q.getResultList();
            if (cList.size() > 0) {
                club = cList.get(0);
            } else {
                log.log(Level.SEVERE, "Club for example generation not found");
                platformUtil.addErrorStore(PROVINCE, "Club for example generation not found for golfGroup: "
                        + gg.getGolfGroupName() + " id: " + gg.getGolfGroupID(), NewGolfGroupUtil.class.getName());
                return;
            }
        }
        //update Pecanwood par - par on each hole
        Query q = dataUtil.em.createNamedQuery("ClubCourse.findByClub", ClubCourse.class);
        q.setParameter("id", club.getClubID());
        List<ClubCourse> ccList = q.getResultList();
        if (!ccList.isEmpty()) {
            ClubCourse cc = ccList.get(0);
            cc.setPar(72);
            cc.setHoles(18);
            cc.setParHole1(4);
            cc.setParHole2(4);
            cc.setParHole3(3);
            cc.setParHole4(4);
            cc.setParHole5(5);
            cc.setParHole6(4);
            cc.setParHole7(5);
            cc.setParHole8(3);
            cc.setParHole9(4);
            cc.setParHole10(5);
            cc.setParHole11(4);
            cc.setParHole12(5);
            cc.setParHole13(3);
            cc.setParHole14(4);
            cc.setParHole15(4);
            cc.setParHole16(4);
            cc.setParHole17(3);
            cc.setParHole18(4);
            dataUtil.em.merge(cc);

        }
        generateExampleTournament(true, gg, pList, club.getClubID(), "Sample Tournament #1", 1, true, 18, 0,
                dataUtil, platformUtil);
        generateExampleTournament(true, gg, pList, club.getClubID(), "Sample Tournament #2", 3, true, 18, 0,
                dataUtil, platformUtil);

        generateExampleTournament(true, gg, pList, club.getClubID(), "Sample Tournament #3", 4, false, 18,
                GENDER_BOYS, dataUtil, platformUtil);
        generateExampleTournament(false, gg, pList, club.getClubID(), "Sample Tournament #4", 4, false, 18,
                GENDER_GIRLS, dataUtil, platformUtil);

        generateExampleTournament(false, gg, pList, club.getClubID(), "Sample Tournament #5", 3, false, 9, 0,
                dataUtil, platformUtil);
        //generateExampleTournament(true, gg, pList, club.getClubID(), "Sample Tournament #6", 6, false, 18, GENDER_BOYS, dataUtil, platformUtil);

        getPictureFiles(gg, pList);

        String msg = MESSAGE + gg.getGolfGroupName();
        log.log(Level.OFF, "*************** DONE! - SampleExample players, parents and tournaments generated: {0}",
                gg.getGolfGroupName());

        platformUtil.addErrorStore(777, msg, "NewGolfGroupUtil");
    }

    static final String MESSAGE = "Sample tournaments generated for ";

    private static void generateExampleTournament(boolean isLive, GolfGroup gg, List<Player> pList, int clubID,
            String tournamentName, int rounds, boolean useAgeGroups, int holesPerRound, int gender,
            DataUtil dataUtil, PlatformUtil platformUtil) throws DataException {
        DateTime dt = new DateTime();
        dt = dt.minusDays(7);
        //
        TournamentDTO t = new TournamentDTO();
        t.setTourneyName(tournamentName);
        t.setGolfRounds(rounds);
        t.setStartDate(dt.getMillis());
        t.setClubID(clubID);
        t.setGolfGroupID(gg.getGolfGroupID());
        t.setHolesPerRound(holesPerRound);
        t.setExampleFlag(1);
        t.setTournamentType(RequestDTO.STROKE_PLAY_INDIVIDUAL);

        if (holesPerRound == 9) {
            t.setPar(36);
        } else {
            t.setPar(72);
        }
        if (rounds > 1) {
            for (int i = 0; i < rounds; i++) {
                dt = dt.plusDays(i);
            }
            t.setEndDate(dt.getMillis());
        } else {
            t.setEndDate(t.getStartDate());
        }
        if (useAgeGroups) {
            t.setUseAgeGroups(1);
        }
        ResponseDTO r = dataUtil.addTournament(t, platformUtil);
        Tournament tournament = new Tournament();
        List<TournamentDTO> tList = r.getTournaments();
        for (TournamentDTO tn : tList) {
            if (tn.getTourneyName().equalsIgnoreCase(t.getTourneyName())) {
                tournament = dataUtil.getTournamentByID(tn.getTournamentID());
                break;
            }
        }
        List<LeaderBoard> list = addPlayersToTournament(pList, tournament, gender, dataUtil, platformUtil);
        log.log(Level.INFO, "LeaderBoard items generated, about to score: {0}", list.size());

        List<TourneyScoreByRound> tsbrList = generateScores(list, tournament.getTournamentID(), dataUtil,
                tournament.getGolfRounds());
        if (isLive) {
            generateScoresForLiveLeaderBoard(tsbrList, list, tournament, dataUtil, rounds);
        }

        log.log(Level.OFF, "Sample Tournament generated: {0} - {1}",
                new Object[] { gg.getGolfGroupName(), tournamentName });
    }

    public static List<TourneyScoreByRound> generateScores(List<LeaderBoard> list, int tournamentID,
            DataUtil dataUtil, int holes) throws DataException {
        log.log(Level.INFO, "------- generating Scores ...");
        int cnt = 0;
        Query q = dataUtil.em.createNamedQuery("TourneyScoreByRound.getByTourney", TourneyScoreByRound.class);
        q.setParameter("id", tournamentID);
        List<TourneyScoreByRound> tsbrList = q.getResultList();
        Random rand = new Random(System.currentTimeMillis());
        for (TourneyScoreByRound tsbr : tsbrList) {
            if (holes == 9) {
                int sum = scoreFirstNine(tsbr, rand);
                tsbr.setTotalScore(sum);

            } else {
                int front = scoreFirstNine(tsbr, rand);
                int back = scoreBackNine(tsbr, rand);
                tsbr.setTotalScore(front + back);
            }
            //
            tsbr.setScoringComplete(1);
            dataUtil.em.merge(tsbr);
            cnt++;
        }
        //update round scores on leaderboard item
        for (LeaderBoard b : list) {
            dataUtil.scoreTotals(b);
        }

        log.log(Level.INFO, "Updated scores, count: {0}", cnt);
        return tsbrList;
    }

    private static int scoreFirstNine(TourneyScoreByRound tsbr, Random rand) {

        tsbr.setScore1(getScore(rand));
        tsbr.setScore2(getScore(rand));
        tsbr.setScore3(getScore(rand));
        tsbr.setScore4(getScore(rand));
        tsbr.setScore5(getScore(rand));
        tsbr.setScore6(getScore(rand));
        tsbr.setScore7(getScore(rand));
        tsbr.setScore8(getScore(rand));
        tsbr.setScore9(getScore(rand));
        int sum = tsbr.getScore1() + tsbr.getScore2() + tsbr.getScore3() + tsbr.getScore4() + tsbr.getScore5()
                + tsbr.getScore6() + tsbr.getScore7() + tsbr.getScore8() + tsbr.getScore9();
        return sum;
    }

    private static int scoreBackNine(TourneyScoreByRound tsbr, Random rand) {
        tsbr.setScore10(getScore(rand));
        tsbr.setScore11(getScore(rand));
        tsbr.setScore12(getScore(rand));
        tsbr.setScore13(getScore(rand));
        tsbr.setScore14(getScore(rand));
        tsbr.setScore15(getScore(rand));
        tsbr.setScore16(getScore(rand));
        tsbr.setScore17(getScore(rand));
        tsbr.setScore18(getScore(rand));
        int sum = tsbr.getScore10() + tsbr.getScore11() + tsbr.getScore12() + tsbr.getScore13() + tsbr.getScore14()
                + tsbr.getScore15() + tsbr.getScore16() + tsbr.getScore17() + tsbr.getScore18();
        return sum;
    }

    private static int getScore(Random rand) {
        int score = rand.nextInt(9);
        if (score < 3) {
            if (rand.nextInt(100) > 70) {
                score = 2; //great!
                //log.log(Level.OFF, "Someone got lucky with a 2....cheap!");
            } else {
                score = 4;
            }
        }
        if (score > 7) {
            if (rand.nextInt(100) > 80) {
                score = 3; //great!
                //log.log(Level.OFF, "Someone got lucky with a 4, for mahala........");
            } else {
                score = 4;
            }
        }
        return score;
    }

    private static void generateScoresForLiveLeaderBoard(List<TourneyScoreByRound> tsbrList, List<LeaderBoard> list,
            Tournament tournament, DataUtil dataUtil, int holes) throws DataException {
        int cnt = 0;
        log.log(Level.OFF, "########## enabling live! leaderBoard");

        //all scored, now remove some scores to make it live!
        int lastRound = 1, holeCnt = holes, pair = 0;
        if (tournament.getGolfRounds() > 1) {
            lastRound = tournament.getGolfRounds();
            for (TourneyScoreByRound tsbr : tsbrList) {
                if (tsbr.getGolfRound() == lastRound) {
                    tsbr.setScoringComplete(0);
                    processHole(tsbr, dataUtil, holeCnt, pair, holes);
                    cnt++;
                    if (holeCnt == 0) {
                        break;
                    }
                }
            }
        } else {
            for (TourneyScoreByRound tsbr : tsbrList) {
                tsbr.setScoringComplete(0);
                processHole(tsbr, dataUtil, holeCnt, pair, holes);
                cnt++;
                if (holeCnt == 0) {
                    break;
                }
            }
        }
        //update round scores on leaderboard item
        for (LeaderBoard b : list) {
            b.setScoringComplete(0);
            b.setTotalScore(0);
            dataUtil.scoreTotals(b);
        }

        log.log(Level.INFO, "***** Updated live! scores, count: {0}", cnt);
    }

    private static void processHole(TourneyScoreByRound tsbr, DataUtil dataUtil, int holeCnt, int pair, int holes) {
        switch (holeCnt) {
        case 18:
            setCounters(holeCnt, pair);
            tsbr.setScore18(0);
            dataUtil.em.merge(tsbr);
            ////log.log(Level.INFO, "enabling live leaderBoard, hole: 18");
            break;
        case 17:
            setCounters(holeCnt, pair);
            tsbr.setScore18(0);
            tsbr.setScore17(0);
            dataUtil.em.merge(tsbr);
            //log.log(Level.INFO, "enabling live leaderBoard, hole: 17");
            break;
        case 16:
            setCounters(holeCnt, pair);
            tsbr.setScore18(0);
            tsbr.setScore17(0);
            tsbr.setScore16(0);
            dataUtil.em.merge(tsbr);
            //log.log(Level.INFO, "enabling live leaderBoard, hole: 16");
            break;
        case 15:
            setCounters(holeCnt, pair);
            tsbr.setScore18(0);
            tsbr.setScore17(0);
            tsbr.setScore16(0);
            tsbr.setScore15(0);
            dataUtil.em.merge(tsbr);
            //log.log(Level.INFO, "enabling live leaderBoard, hole: 15");
        case 14:
            setCounters(holeCnt, pair);
            tsbr.setScore18(0);
            tsbr.setScore17(0);
            tsbr.setScore16(0);
            tsbr.setScore15(0);
            tsbr.setScore14(0);
            dataUtil.em.merge(tsbr);
            //log.log(Level.INFO, "enabling live leaderBoard, hole: 14");
            break;
        case 13:
            setCounters(holeCnt, pair);
            tsbr.setScore18(0);
            tsbr.setScore17(0);
            tsbr.setScore16(0);
            tsbr.setScore15(0);
            tsbr.setScore14(0);
            tsbr.setScore13(0);
            dataUtil.em.merge(tsbr);
        case 12:
            setCounters(holeCnt, pair);
            tsbr.setScore18(0);
            tsbr.setScore17(0);
            tsbr.setScore16(0);
            tsbr.setScore15(0);
            tsbr.setScore14(0);
            tsbr.setScore13(0);
            tsbr.setScore12(0);
            dataUtil.em.merge(tsbr);
        case 11:
            setCounters(holeCnt, pair);
            tsbr.setScore18(0);
            tsbr.setScore17(0);
            tsbr.setScore16(0);
            tsbr.setScore15(0);
            tsbr.setScore14(0);
            tsbr.setScore13(0);
            tsbr.setScore12(0);
            tsbr.setScore11(0);
            dataUtil.em.merge(tsbr);
        case 10:
            setCounters(holeCnt, pair);
            tsbr.setScore18(0);
            tsbr.setScore17(0);
            tsbr.setScore16(0);
            tsbr.setScore15(0);
            tsbr.setScore14(0);
            tsbr.setScore13(0);
            tsbr.setScore12(0);
            tsbr.setScore11(0);
            tsbr.setScore10(0);
            dataUtil.em.merge(tsbr);
        case 9:
            setCounters(holeCnt, pair);
            tsbr.setScore18(0);
            tsbr.setScore17(0);
            tsbr.setScore16(0);
            tsbr.setScore15(0);
            tsbr.setScore14(0);
            tsbr.setScore13(0);
            tsbr.setScore12(0);
            tsbr.setScore11(0);
            tsbr.setScore10(0);
            tsbr.setScore9(0);
            dataUtil.em.merge(tsbr);
            break;

        }
    }

    private static void setCounters(int holeCnt, int pair) {
        if (pair > 2) {
            holeCnt--;
            pair = 0;
        } else {
            pair++;
        }
    }

    static Connection conn;
    static PreparedStatement preparedStatement;

    private static List<Player> generatePlayers(GolfGroup gg, DataUtil dataUtil) throws DataException {

        List<Player> pList = new ArrayList<>();
        try {
            if (conn == null || conn.isClosed()) {
                conn = dataUtil.em.unwrap(Connection.class);
            }
            if (preparedStatement == null || preparedStatement.isClosed()) {
                preparedStatement = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            }

            //add boys
            //pList.addAll(addPlayersByAgeGender(gg, 10, GENDER_BOYS, dataUtil));
            pList.addAll(addPlayersByAgeGender(gg, 12, GENDER_BOYS, dataUtil));
            //pList.addAll(addPlayersByAgeGender(gg, 14, GENDER_BOYS, dataUtil));
            pList.addAll(addPlayersByAgeGender(gg, 16, GENDER_BOYS, dataUtil));
            //pList.addAll(addPlayersByAgeGender(gg, 18, GENDER_BOYS, dataUtil));
            //add girls
            //pList.addAll(addPlayersByAgeGender(gg, 10, GENDER_GIRLS, dataUtil));
            pList.addAll(addPlayersByAgeGender(gg, 12, GENDER_GIRLS, dataUtil));
            // pList.addAll(addPlayersByAgeGender(gg, 14, GENDER_GIRLS, dataUtil));
            pList.addAll(addPlayersByAgeGender(gg, 16, GENDER_GIRLS, dataUtil));
            //pList.addAll(addPlayersByAgeGender(gg, 18, GENDER_GIRLS, dataUtil));

            log.log(Level.OFF, "###### Players generated: {0}", pList.size());
            //add scorers
            Random rand = new Random(System.currentTimeMillis());
            Scorer s1 = new Scorer();
            s1.setGolfGroup(gg);
            s1.setFirstName(firstNames[rand.nextInt(firstNames.length - 1)]);
            s1.setLastName(lastNames[rand.nextInt(lastNames.length - 1)]);
            s1.setEmail(s1.getFirstName().toLowerCase() + "." + s1.getLastName().toLowerCase() + "."
                    + (rand.nextInt()) + "@gmail.com");
            s1.setCellphone("999 999 9999");
            s1.setPin("12345");
            s1.setExampleFlag(1);
            s1.setDateRegistered(new Date());
            dataUtil.em.persist(s1);
            //
            Scorer s2 = new Scorer();
            s2.setGolfGroup(gg);
            s2.setFirstName(firstNames[rand.nextInt(firstNames.length - 1)]);
            s2.setLastName(lastNames[rand.nextInt(lastNames.length - 1)]);
            s2.setEmail(s2.getFirstName().toLowerCase() + "." + s2.getLastName().toLowerCase() + "."
                    + (rand.nextInt()) + "@gmail.com");
            s2.setCellphone("999 999 9999");
            s2.setPin("12345");
            s2.setExampleFlag(1);
            s2.setDateRegistered(new Date());
            dataUtil.em.persist(s2);
            //
            Scorer s3 = new Scorer();
            s3.setGolfGroup(gg);
            s3.setFirstName(girls[rand.nextInt(girls.length - 1)]);
            s3.setLastName(lastNames[rand.nextInt(lastNames.length - 1)]);
            s3.setEmail(s3.getFirstName().toLowerCase() + "." + s3.getLastName().toLowerCase() + "."
                    + (rand.nextInt()) + "@gmail.com");
            s3.setCellphone("999 999 9999");
            s3.setPin("12345");
            s3.setExampleFlag(1);
            s3.setDateRegistered(new Date());
            dataUtil.em.persist(s3);
            //
            Scorer s4 = new Scorer();
            s4.setGolfGroup(gg);
            s4.setFirstName(firstNames[rand.nextInt(firstNames.length - 1)]);
            s4.setLastName(lastNames[rand.nextInt(lastNames.length - 1)]);
            s4.setEmail(s4.getFirstName().toLowerCase() + "." + s4.getLastName().toLowerCase() + "."
                    + (rand.nextInt()) + "@gmail.com");
            s4.setCellphone("999 999 9999");
            s4.setPin("12345");
            s4.setDateRegistered(new Date());
            s4.setExampleFlag(1);
            dataUtil.em.persist(s4);

        } catch (SQLException ex) {
            Logger.getLogger(NewGolfGroupUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
        return pList;
    }

    static String sql = "INSERT INTO player (firstName, lastName, dateOfBirth, gender, email, pin, exampleFlag, yearJoined, dateRegistered) "
            + "values(?, ?, ?, ?, ?, ?, ?, ?, ?)";

    private static List<Player> addPlayersByAgeGender(GolfGroup gg, int age, int gender, DataUtil dataUtil)
            throws DataException {
        log.log(Level.WARNING, "############## Adding example players, age: {0} gender: {1} - {2}",
                new Object[] { age, gender, gg.getGolfGroupName() });
        List<Player> pList = new ArrayList<>();

        Random rand = new Random(System.currentTimeMillis());
        int fNameIndex;
        int lNameIndex;
        int genderCount;
        if (gender == GENDER_BOYS) {
            genderCount = rand.nextInt(16);
            if (genderCount < 8) {
                genderCount = 8;
            }
        } else {
            genderCount = rand.nextInt(8);
            if (genderCount < 4) {
                genderCount = 4;
            }
        }

        for (int i = 0; i < genderCount; i++) {
            Player p = new Player();
            if (gender == GENDER_BOYS) {
                fNameIndex = rand.nextInt(firstNames.length - 1);
                p.setFirstName(firstNames[fNameIndex]);
            } else {
                fNameIndex = rand.nextInt(girls.length - 1);
                p.setFirstName(girls[fNameIndex]);
            }
            lNameIndex = rand.nextInt(lastNames.length - 1);
            //static String sql = "INSERT INTO player (firstName, lastName, dateOfBirth, gender, email, pin, exampleFlag, yearJoined, dateRegistered) "
            //            + "values(?, ?, ?, ?, ?, ?, ?, ?, ?)";
            p.setDateRegistered(new Date());
            p.setLastName(lastNames[lNameIndex]);
            p.setEmail(p.getFirstName().toLowerCase() + "." + p.getLastName().toLowerCase() + "." + (rand.nextInt())
                    + "@mg.com");
            p.setCellphone("999 999 9999");
            p.setGender(gender);
            p.setPin("12345");
            p.setYearJoined(2013);
            p.setDateOfBirth(getDateOfBirth(age));
            p.setExampleFlag(1);

            try {
                dataUtil.em.persist(p);
                Query q = dataUtil.em.createQuery("select a from Player a where a.email = :email");
                q.setParameter("email", p.getEmail());
                Player player = (Player) q.getSingleResult();
                if (player != null) {
                    log.log(Level.INFO, "Player retrieved {0} {1} {2}",
                            new Object[] { player.getPlayerID(), player.getFirstName(), player.getLastName() });
                    GolfGroupPlayer ggp = new GolfGroupPlayer();
                    ggp.setDateRegistered(new Date());
                    ggp.setGolfGroup(gg);
                    ggp.setPlayer(player);
                    dataUtil.em.persist(ggp);
                    pList.add(ggp.getPlayer());
                } else {
                    log.log(Level.INFO, "************ have to do it the hard way - WHY??....");
                    preparedStatement.setString(1, p.getFirstName());
                    preparedStatement.setString(2, p.getLastName());
                    preparedStatement.setDate(3, new java.sql.Date(p.getDateOfBirth().getTime()));
                    preparedStatement.setInt(4, gender);
                    preparedStatement.setString(5, p.getEmail());
                    preparedStatement.setString(6, "12345");
                    preparedStatement.setInt(7, 1);
                    preparedStatement.setInt(8, 2013);
                    preparedStatement.setDate(9, new java.sql.Date(new Date().getTime()));

                    boolean isOK = preparedStatement.execute();
                    player = new Player();
                    if (isOK) {
                        ResultSet rs = preparedStatement.getResultSet();
                        int id = 0;
                        if (rs.next()) {
                            player.setPlayerID(rs.getInt(1));
                            //log.log(Level.INFO, "######### playerID returned: {0}", id);
                        }
                        //
                        if (player.getPlayerID() > 0) {
                            GolfGroupPlayer ggp = new GolfGroupPlayer();
                            ggp.setDateRegistered(new Date());
                            ggp.setGolfGroup(gg);
                            ggp.setPlayer(dataUtil.em.find(Player.class, player.getPlayerID()));
                            dataUtil.em.persist(ggp);
                            pList.add(ggp.getPlayer());
                        }
                    } else {
                        //log.log(Level.OFF, "..return from execute {0}", isOK);
                    }
                }

            } catch (SQLException e) {
                log.log(Level.SEVERE, "Fucked!!!", e);
            }

        }

        return pList;
    }
    /* 
     Parent f = new Parent();
     f.setExampleFlag(1);
     f.setLastName(player.getLastName());
     if (gender == GENDER_BOYS) {
     f.setFirstName(firstNames[parentIndex]);
     } else {
     f.setFirstName(girls[parentIndex]);
     }
     f.setEmail(f.getFirstName().toLowerCase()
     + "." + f.getLastName().toLowerCase()
     + "." + (rand.nextInt())
     + "@gmail.com");
     f.setCellphone("999 999 9999");
     f.setPin("12345");
     dataUtil.em.persist(f);
     Query w = dataUtil.em.createNamedQuery("Parent.findByEmail", Parent.class);
     w.setParameter("email", f.getEmail());
     Parent parent = (Parent) w.getSingleResult();
     GolfGroupParent d = new GolfGroupParent();
     d.setDateRegistered(new Date());
     d.setGolfGroup(gg);
     d.setParent(parent);
     dataUtil.em.persist(d); */

    private static List<LeaderBoard> addPlayersToTournament(List<Player> pList, Tournament t, int gender,
            DataUtil dataUtil, PlatformUtil platformUtil) throws DataException {
        List<LeaderBoard> lbList;
        switch (gender) {
        case 0: //All players
            for (Player player : pList) {
                if (t.getHolesPerRound() == 9) {
                    int age = getPlayerAge(player.getDateOfBirth().getTime());
                    if (age > 12) {
                        continue;
                    }
                }
                LeaderBoardDTO lb = new LeaderBoardDTO();
                lb.setTournamentID(t.getTournamentID());
                lb.setPlayer(new PlayerDTO(player));
                dataUtil.addTournamentPlayer(lb, platformUtil);

            }
            break;
        case GENDER_BOYS:
            for (Player player : pList) {
                if (player.getGender() == GENDER_GIRLS) {
                    continue;
                }
                if (t.getHolesPerRound() == 9) {
                    int age = getPlayerAge(player.getDateOfBirth().getTime());
                    if (age > 12) {
                        continue;
                    }
                }
                LeaderBoardDTO lb = new LeaderBoardDTO();
                lb.setTournamentID(t.getTournamentID());
                lb.setPlayer(new PlayerDTO(player));
                dataUtil.addTournamentPlayer(lb, platformUtil);

            }
            break;
        case GENDER_GIRLS:
            for (Player player : pList) {
                if (player.getGender() == GENDER_BOYS) {
                    continue;
                }
                if (t.getHolesPerRound() == 9) {
                    int age = getPlayerAge(player.getDateOfBirth().getTime());
                    if (age > 12) {
                        continue;
                    }
                }
                LeaderBoardDTO lb = new LeaderBoardDTO();
                lb.setTournamentID(t.getTournamentID());
                lb.setPlayer(new PlayerDTO(player));
                dataUtil.addTournamentPlayer(lb, platformUtil);

            }
            break;
        }

        Query q = dataUtil.em.createNamedQuery("LeaderBoard.findByTournament", LeaderBoard.class);
        q.setParameter("id", t.getTournamentID());
        lbList = q.getResultList();

        return lbList;
    }

    private static int getPlayerAge(long date) {
        LocalDateTime birthday = new LocalDateTime(date);
        LocalDateTime start = new LocalDateTime();
        Years years = Years.yearsBetween(birthday, start);
        return years.getYears();
    }

    private static Date getDateOfBirth(int age) {

        DateTime dt = new DateTime();
        dt = dt.minusYears(age);
        Random rand = new Random(System.currentTimeMillis());
        int mth = rand.nextInt(dt.getMonthOfYear());
        int day = rand.nextInt(28);
        if (mth == 0) {
            mth = 1;
        }
        if (day == 0) {
            day = 1;
        }
        DateTime x = new DateTime(dt.getYear(), mth, day, 0, 0);
        return new Date(x.getMillis());
    }

    public static String[] firstNames = { "Benjamin", "Johnny", "Tom", "Sam", "Thomas", "Zeke", "John", "Tommy",
            "Peter", "Paul", "Forrest", "Bennie", "Mark", "MacDonald", "McLean", "Chris", "Frank", "Mark", "Ronald",
            "Ronnie", "Blake", "John", "Vincent", "Jack", "Bobby", "Malenga", "Sean", "Shane", "Mack", "Jonty",
            "Lance", "David", "Adam", "Luke", "Jean", "Peter", "Francois", "Stephen", "Geoffrey", "Omar", "Andre",
            "Robert", "Hunter", "William", "Harry", "Boyce", "Lee", "Lawrence", "Michael", "Noonan", "Caleb",
            "Jacob", "Samuel", "Andrew", "Bernard", "Jack", "Tommy", "Johannes", "Lance", "Jeremiah", "Jerry",
            "Trayvon", "Newton", "Sam", "Fred", "TJ", "Raymond", "Godfrey", "Charlie", "Mingus", "Ryan", "Steve",
            "Stephen", "Hunter", "Henry", "Jordan", "Andrew", "Brandon", "Louis", "Christopher", "Daniel", "Eli",
            "Liam", "Carter", "Dominic", "Parker", "Anthony", "Benjamin", "Lucas", "Connor", "Zachary", "Cameron",
            "Matthew", "Justin", "Nathan", "Sebastian", "Brody", "Alexander", "Alex", "Levi", "James", "Aiden",
            "Cooper", "Xavier", "Ryder", "Michael", "Tyler", "Ethan", "Jonathan", "Robert", "Roberto", "Gabriel",
            "Chase", "Logan", "Hudson", "Julian", "Aaron", "Severiano", "Owen" };
    public static String[] lastNames = { "Armstrong", "Maringa", "Scott", "Oosthuizen", "Els", "Schwartzel",
            "Botha", "Smythe", "Baker", "Watson", "Jobs", "Player", "Locke", "Black", "Charles", "Grainger",
            "Jones", "Brown", "Peterson", "Mickels", "Pollack", "Peyton", "Williams", "Zuckerberg", "Samuels",
            "Hernandez", "Johnson", "Gray", "Davidson", "Lombardi", "Smith", "Jackson", "Chauke", "Morris",
            "Peterson", "Paulson", "Remington", "Priest", "Church", "Charles", "Burmingham", "Naidoo", "Bala",
            "Renoir", "Switzer", "Dennison", "Johnson", "Jerram", "Adams", "Wilson", "Hepburn", "Giggs", "Stephens",
            "Dafoe", "Daggett", "Dahlberg", "Dangerfield", "Danziger", "Daniels", "Smith", "Smythe", "Calandrino",
            "Cadwell", "Callaghan", "California", "Villegas", "Camilleri", "Hackney", "Hackman", "Hackett",
            "Haagensen", "Hackworth", "Hacker", "Hachmeister", "Hack", "Duff", "Haigwood", "Wood", "Woods",
            "Mickelson", "Taglieri", "Tanaka", "Tailor", "Talarico", "Talbot", "Tafoya", "Tartaglia", "Gaffney",
            "Gagliardi", "Gaillard", "Galaska", "Dufner", "Gambetta", "Fabiani", "Factor", "Fahlstrom", "Fagin",
            "Faldo", "Fariello", "Packwood", "Pacino", "Paganelli", "Page", "Pagani", "Palinski", "Rafferty",
            "Rabinovitz", "Radcliffe", "Raindford", "Rainsford"

    };

    public static String[] girls = { "Mary", "Louise", "Brenda", "Samantha", "Ivanka", "Petra", "Maria", "Sue",
            "Thabitah", "Henrietta", "Fannie", "Bernande", "Linda", "Catherine", "Lee", "Christina", "Denise",
            "Yvonne", "Isabella", "Mia", "Blake", "Alexis", "Sofia", "Claire", "Melanie", "Sarah", "Brianna",
            "Jasmine", "Grace", "Hannah", "Elizabeth", "Natalie", "Allison", "Zoe", "Jean", "Julia", "Lucy",
            "Hailey", "Leah", "Andrea", "Kaylee", "Victoria", "Jocelyn", "Brooklyn", "Sophie", "Madison", "Taylor",
            "Alexandra", "Alexa", "Riley", "Aubree", "Naomi", "Kayla", "Michelle", "Bernande", "Arianne", "Anna",
            "Gabriella", "Madeline", "Maggie", "Evelyn", "Lily", "Bella", "Savannah", "Kimberley", "Charlotte",
            "Stella", "Leah", "Ella", "Serenity", "Katherine", "Reagan", "Godiva", "Caroline", "Alyssa", "Sarah",
            "Molly", "Morgan", "Chloe" };

    private static void getPictureFiles(GolfGroup gg, List<Player> pList) {
        log.log(Level.INFO, "########## Image file processing starting ...");
        Collections.sort(pList);
        File dir = GolfProperties.getImageDir(); //golf_images
        File ggDir = new File(dir, "golfgroup" + gg.getGolfGroupID());
        if (!ggDir.exists()) {
            ggDir.mkdir();
        }
        File playerDir = new File(ggDir, "player");
        if (!playerDir.exists()) {
            playerDir.mkdir();
        }

        File templateDir = GolfProperties.getImageTemplateDir();
        File boysDir = new File(templateDir, "boys");
        File girlsDir = new File(templateDir, "girls");

        File[] boysFiles = boysDir.listFiles();
        File[] girlsFiles = girlsDir.listFiles();
        log.log(Level.INFO, "#picture dirs; {0} girls: {1}",
                new Object[] { boysDir.getAbsolutePath(), girlsDir.getAbsolutePath() });

        List<Player> females = new ArrayList<>();
        List<Player> males = new ArrayList<>();
        for (Player player : pList) {
            if (player.getGender() == GENDER_BOYS) {
                males.add(player);
            } else {
                females.add(player);
            }
        }

        int index = 0;
        for (File file : girlsFiles) {
            if (!file.getName().contains(".jpg")) {
                continue;
            }
            if (index < females.size()) {
                Player p = females.get(index);
                File newFile = new File(playerDir, "t" + p.getPlayerID() + ".jpg");
                String name = p.getFirstName() + " " + p.getLastName();
                try {
                    copyFile(file, newFile, name);
                } catch (IOException ex) {
                    log.log(Level.SEVERE, null, ex);
                }
            }
            index++;
        }
        index = 0;
        for (File file : boysFiles) {
            if (!file.getName().contains(".jpg")) {
                continue;
            }
            if (index < males.size()) {
                Player p = males.get(index);
                File newFile = new File(playerDir, "t" + p.getPlayerID() + ".jpg");
                String name = p.getFirstName() + " " + p.getLastName();
                try {
                    copyFile(file, newFile, name);
                } catch (IOException ex) {
                    log.log(Level.SEVERE, "Shite!", ex);
                }
            }
            index++;
        }

    }

    private static void copyFile(File fromFile, File toFile, String name) throws IOException {
        Path FROM = Paths.get(fromFile.getAbsolutePath());
        Path TO = Paths.get(toFile.getAbsolutePath());
        //overwrite existing file, if exists...
        CopyOption[] options = new CopyOption[] { StandardCopyOption.REPLACE_EXISTING,
                StandardCopyOption.COPY_ATTRIBUTES };
        Files.copy(FROM, TO, options);
        log.log(Level.OFF, "Image file copied, created: {0}, file: {1}",
                new Object[] { name, toFile.getAbsolutePath() });
    }
}