/*******************************************************************************
 * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *              dclarke - initial JPA Employee example using XML (bug 217884)
 ******************************************************************************/
package example;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

import model.*;

/**
 * This example populates the database with example instances using JPA.
 */
public class Populate {

    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("employee");
        populate(emf);
        emf.close();
    }

    public static void populate(EntityManagerFactory emf) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        population = new Populate();
        Populate.population.persistAll(em);
        em.getTransaction().commit();
        em.close();
    }

    public static Populate population = new Populate();

    public Employee[] employees = { basicEmployeeExample1(), basicEmployeeExample2(), basicEmployeeExample3(), basicEmployeeExample4(), basicEmployeeExample5(), basicEmployeeExample6(),
            basicEmployeeExample7(), basicEmployeeExample8(), basicEmployeeExample9(), basicEmployeeExample10(), basicEmployeeExample11(), basicEmployeeExample12() };

    private SmallProject[] smallProjects = { basicSmallProjectExample1(), basicSmallProjectExample2(), basicSmallProjectExample3(), basicSmallProjectExample4(), basicSmallProjectExample5(),
            basicSmallProjectExample7(), basicSmallProjectExample8(), basicSmallProjectExample9(), basicSmallProjectExample10() };

    private LargeProject[] largeProjects = { basicLargeProjectExample1(), basicLargeProjectExample2(), basicLargeProjectExample3(), basicLargeProjectExample4(), basicLargeProjectExample5() };

    private JobTitle[] jobTitles = { new JobTitle("CEO"), new JobTitle("VP"), new JobTitle("Manager"), new JobTitle("Developer"), new JobTitle("Admin") };

    private Populate() {

        // Setup management hierarchy
        addManagedEmployees(0, new int[] { 2, 3, 4 });
        setJobTitle(0, 2);
        addManagedEmployees(1, new int[] { 5, 0 });
        setJobTitle(1, 2);
        addManagedEmployees(2, new int[] {});
        setJobTitle(0, 3);
        addManagedEmployees(3, new int[] {});
        setJobTitle(0, 3);
        addManagedEmployees(4, new int[] {});
        setJobTitle(0, 3);
        addManagedEmployees(5, new int[] {});
        setJobTitle(5, 4);
        addManagedEmployees(6, new int[] {});
        setJobTitle(6, 4);
        addManagedEmployees(7, new int[] {});
        setJobTitle(7, 1);
        addManagedEmployees(8, new int[] {});
        setJobTitle(8, 4);
        addManagedEmployees(9, new int[] { 7, 8, 10, 11 });
        setJobTitle(9, 0);
        addManagedEmployees(10, new int[] { 6 });
        setJobTitle(10, 1);
        addManagedEmployees(11, new int[] { 1 });
        setJobTitle(11, 1);

        // Setup Employee-Project associations
        addProjects(0, new int[] { 0, 1, 2 }, new int[] {});
        addProjects(1, new int[] { 3, 4, 0 }, new int[] {});
        addProjects(2, new int[] { 3 }, new int[] { 3, 4 });
        addProjects(4, new int[] { 3, 1 }, new int[] { 2, 4 });
        addProjects(5, new int[] {}, new int[] { 1 });
        addProjects(6, new int[] {}, new int[] { 1 });

        // Setup LargeProject leads
        this.largeProjects[0].setTeamLeader(this.employees[1]);
        this.largeProjects[3].setTeamLeader(this.employees[2]);
        this.largeProjects[4].setTeamLeader(this.employees[2]);
    }

    public Employee basicEmployeeExample1() {
        Employee employee = new Employee();

        employee.setFirstName("Bob");
        employee.setLastName("Smith");
        employee.setGender(Gender.Male);
        employee.setSalary(35000);

        EmploymentPeriod employmentPeriod = new EmploymentPeriod();
        employmentPeriod.setEndDate(1996, 0, 1);
        employmentPeriod.setStartDate(1993, 0, 1);
        employee.setPeriod(employmentPeriod);

        Address address = new Address();
        address.setCity("Toronto");
        address.setPostalCode("L5J2B5");
        address.setProvince("ONT");
        address.setStreet("1450 Acme Cr., Suite 4");
        address.setCountry("Canada");
        employee.setAddress(address);

        employee.addResponsibility("Water the office plants.");
        employee.addResponsibility("Maintain the kitchen facilities.");
        employee.addPhoneNumber("Work", "613", "5558812");

        return employee;
    }

    public Employee basicEmployeeExample10() {
        Employee employee = new Employee();

        employee.setFirstName("Jill");
        employee.setLastName("May");
        employee.setGender(Gender.Female);

        EmploymentPeriod employmentPeriod = new EmploymentPeriod();
        employmentPeriod.setStartDate(1991, 10, 11);
        employee.setPeriod(employmentPeriod);

        Address address = new Address();
        address.setCity("Calgary");
        address.setPostalCode("J5J2B5");
        address.setProvince("AB");
        address.setStreet("1111 Mooseland Rd.");
        address.setCountry("Canada");
        employee.setAddress(address);

        employee.setSalary(56232);
        employee.addPhoneNumber("Work", "613", "5558812");
        employee.addPhoneNumber("Work Fax", "613", "5555943");
        employee.addEmailAddress("Work", "jill.may@acme.com");
        employee.addEmailAddress("Mobile", "jill.lewis.may@sprint.com");
        employee.addDegree("Bachelor Computer Science");
        employee.addDegree("Masters Computer Science");
        employee.addDegree("PHD Computer Science");

        return employee;
    }

    public Employee basicEmployeeExample11() {
        Employee employee = new Employee();

        employee.setFirstName("Sarah-Lou");
        employee.setLastName("Smitty");
        employee.setGender(Gender.Female);

        EmploymentPeriod employmentPeriod = new EmploymentPeriod();
        employmentPeriod.setEndDate(1996, 0, 1);
        employmentPeriod.setStartDate(1993, 0, 1);
        employee.setPeriod(employmentPeriod);

        Address address = new Address();
        address.setCity("Arnprior");
        address.setPostalCode("W1A2B5");
        address.setProvince("ONT");
        address.setStreet("1 Hawthorne Drive");
        address.setCountry("Canada");
        employee.setAddress(address);

        employee.setSalary(75000);
        employee.addPhoneNumber("Work Fax", "613", "5555943");
        employee.addPhoneNumber("Home", "613", "5551234");
        employee.addPhoneNumber("Cellular", "416", "5551111");
        employee.addEmailAddress("Home", "sarah-lou.smitty@rogers.com");
        employee.addDegree("Bachelor Computer Science");

        return employee;
    }

    public Employee basicEmployeeExample12() {
        Employee employee = new Employee();

        employee.setFirstName("Jim-Bob");
        employee.setLastName("Jefferson");
        employee.setGender(Gender.Male);

        EmploymentPeriod employmentPeriod = new EmploymentPeriod();
        employmentPeriod.setEndDate(2001, 11, 31);
        employmentPeriod.setStartDate(1995, 0, 12);
        employee.setPeriod(employmentPeriod);

        Address address = new Address();
        address.setCity("Yellowknife");
        address.setPostalCode("Y5J2N5");
        address.setProvince("YK");
        address.setStreet("1112 Gold Rush Rd.");
        address.setCountry("Canada");
        employee.setAddress(address);

        employee.setSalary(50000);
        employee.addPhoneNumber("Home", "613", "5551234");
        employee.addPhoneNumber("Cellular", "416", "5551111");
        employee.addEmailAddress("Home", "jim-bob@jim-bob.com");

        return employee;
    }

    public Employee basicEmployeeExample2() {
        Employee employee = new Employee();

        employee.setFirstName("John");
        employee.setLastName("Way");
        employee.setGender(Gender.Male);
        employee.setSalary(53000);

        EmploymentPeriod employmentPeriod = new EmploymentPeriod();
        employmentPeriod.setStartDate(1991, 10, 11);
        employee.setPeriod(employmentPeriod);

        Address address = new Address();
        address.setCity("Ottawa");
        address.setPostalCode("K5J2B5");
        address.setProvince("ONT");
        address.setStreet("12 Merivale Rd., Suite 5");
        address.setCountry("Canada");
        employee.setAddress(address);

        employee.addResponsibility("Hire people when more people are required.");
        employee.addResponsibility("Lay off employees when less people are required.");
        employee.addPhoneNumber("Work", "613", "5558812");
        employee.addPhoneNumber("ISDN", "905", "5553691");
        employee.addEmailAddress("Work", "john.way@acme.com");
        employee.addDegree("Bachelor Computer Science");

        return employee;
    }

    public Employee basicEmployeeExample3() {
        Employee employee = new Employee();

        employee.setFirstName("Charles");
        employee.setLastName("Chanley");
        employee.setGender(Gender.Male);
        employee.setSalary(43000);

        EmploymentPeriod employmentPeriod = new EmploymentPeriod();
        employmentPeriod.setEndDate(2001, 11, 31);
        employmentPeriod.setStartDate(1995, 0, 1);
        employee.setPeriod(employmentPeriod);

        Address address = new Address();
        address.setCity("Montreal");
        address.setPostalCode("Q2S5Z5");
        address.setProvince("QUE");
        address.setStreet("1 Canadien Place");
        address.setCountry("Canada");
        employee.setAddress(address);

        employee.addResponsibility("Perform code reviews as required.");
        employee.addPhoneNumber("Pager", "976", "5556666");
        employee.addPhoneNumber("ISDN", "905", "5553691");
        employee.addEmailAddress("Work", "charles.chanley@acme.com");

        return employee;
    }

    public Employee basicEmployeeExample4() {
        Employee employee = new Employee();

        employee.setFirstName("Emanual");
        employee.setLastName("Smith");
        employee.setGender(Gender.Male);
        employee.setSalary(49631);

        EmploymentPeriod employmentPeriod = new EmploymentPeriod();
        employmentPeriod.setEndDate(2001, 11, 31);
        employmentPeriod.setStartDate(1995, 0, 1);
        employee.setPeriod(employmentPeriod);

        Address address = new Address();
        address.setCity("Vancouver");
        address.setPostalCode("N5J2N5");
        address.setProvince("BC");
        address.setStreet("20 Mountain Blvd., Floor 53, Suite 6");
        address.setCountry("Canada");
        employee.setAddress(address);

        employee.addResponsibility("Have to fix the Database problem.");
        employee.addPhoneNumber("Work Fax", "613", "5555943");
        employee.addPhoneNumber("Cellular", "416", "5551111");
        employee.addPhoneNumber("Pager", "976", "5556666");
        employee.addPhoneNumber("ISDN", "905", "5553691");
        employee.addEmailAddress("Work", "emanual.smith@acme.com");

        return employee;
    }

    public Employee basicEmployeeExample5() {
        Employee employee = new Employee();

        employee.setFirstName("Sarah");
        employee.setLastName("Way");
        employee.setGender(Gender.Female);
        employee.setSalary(87000);

        EmploymentPeriod employmentPeriod = new EmploymentPeriod();
        employmentPeriod.setEndDate(2001, 6, 31);
        employmentPeriod.setStartDate(1995, 4, 1);
        employee.setPeriod(employmentPeriod);

        Address address = new Address();
        address.setCity("Prince Rupert");
        address.setPostalCode("K3K5D5");
        address.setProvince("BC");
        address.setStreet("3254 Parkway Place");
        address.setCountry("Canada");
        employee.setAddress(address);

        employee.addResponsibility("Write code documentation.");
        employee.addPhoneNumber("Work", "613", "5558812");
        employee.addPhoneNumber("ISDN", "905", "5553691");
        employee.addPhoneNumber("Home", "613", "5551234");
        employee.addEmailAddress("Work", "sarah.way@acme.com");

        return employee;
    }

    public Employee basicEmployeeExample6() {
        Employee employee = new Employee();

        employee.setFirstName("Marcus");
        employee.setLastName("Saunders");
        employee.setGender(Gender.Male);
        employee.setSalary(54300);

        EmploymentPeriod employmentPeriod = new EmploymentPeriod();
        employmentPeriod.setEndDate(2001, 11, 31);
        employmentPeriod.setStartDate(1995, 0, 12);
        employee.setPeriod(employmentPeriod);

        Address address = new Address();
        address.setCity("Perth");
        address.setPostalCode("Y3Q2N9");
        address.setProvince("ONT");
        address.setStreet("234 Caledonia Lane");
        address.setCountry("Canada");
        employee.setAddress(address);

        employee.addResponsibility("Write user specifications.");
        employee.addPhoneNumber("ISDN", "905", "5553691");
        employee.addPhoneNumber("Work", "613", "5558812");
        employee.addEmailAddress("Work", "marcus.saunders@acme.com");
        employee.addDegree("Bachelor Computer Science");
        employee.addDegree("Masters Computer Science");

        return employee;
    }

    public Employee basicEmployeeExample7() {
        Employee employee = new Employee();

        employee.setFirstName("Nancy");
        employee.setLastName("White");
        employee.setGender(Gender.Female);
        employee.setSalary(31000);

        EmploymentPeriod employmentPeriod = new EmploymentPeriod();
        employmentPeriod.setEndDate(1996, 0, 1);
        employmentPeriod.setStartDate(1993, 0, 1);
        employee.setPeriod(employmentPeriod);

        Address address = new Address();
        address.setCity("Metcalfe");
        address.setPostalCode("Y4F7V6");
        address.setProvince("ONT");
        address.setStreet("2 Anderson Rd.");
        address.setCountry("Canada");
        employee.setAddress(address);

        employee.addPhoneNumber("Home", "613", "5551234");
        employee.addEmailAddress("Work", "nancy.white@acme.com");

        return employee;
    }

    public Employee basicEmployeeExample8() {
        Employee employee = new Employee();

        employee.setFirstName("Fred");
        employee.setLastName("Jones");
        employee.setGender(Gender.Male);
        employee.setSalary(500000);

        EmploymentPeriod employmentPeriod = new EmploymentPeriod();
        employmentPeriod.setEndDate(2001, 11, 31);
        employmentPeriod.setStartDate(1995, 0, 1);
        employee.setPeriod(employmentPeriod);

        Address address = new Address();
        address.setCity("Victoria");
        address.setPostalCode("Z5J2N5");
        address.setProvince("BC");
        address.setStreet("382 Hyde Park Blvd.");
        address.setCountry("Canada");
        employee.setAddress(address);

        employee.addPhoneNumber("Cellular", "416", "5551111");
        employee.addPhoneNumber("ISDN", "905", "5553691");
        employee.addEmailAddress("Work", "fred.jones@acme.com");
        employee.addDegree("Bachelor Business");
        employee.addDegree("Masters Business");

        return employee;
    }

    public Employee basicEmployeeExample9() {
        Employee employee = new Employee();

        employee.setFirstName("Betty");
        employee.setLastName("Jones");
        employee.setGender(Gender.Female);
        employee.setSalary(500001);

        EmploymentPeriod employmentPeriod = new EmploymentPeriod();
        employmentPeriod.setStartDate(2001, 11, 31);
        employmentPeriod.setEndDate(1995, 0, 1);
        employee.setPeriod(employmentPeriod);

        Address address = new Address();
        address.setCity("Smith Falls");
        address.setPostalCode("C6C6C6");
        address.setProvince("ONT");
        address.setStreet("89 Chocolate Drive");
        address.setCountry("Canada");
        employee.setAddress(address);

        employee.addPhoneNumber("Work", "613", "5558812");
        employee.addPhoneNumber("ISDN", "905", "5553691");
        employee.addEmailAddress("Work", "betty.jones@acme.com");
        employee.addEmailAddress("Home", "betty.cleo.jones@rogers.com");
        employee.addDegree("Bachelor Arts");
        employee.addDegree("Masters Engineering");
        employee.addDegree("PHD Philosophy");

        return employee;
    }

    public LargeProject basicLargeProjectExample1() {
        LargeProject largeProject = new LargeProject();

        largeProject.setName("Sales Reporting");
        largeProject.setDescription("A reporting application to report on the corporations database through TopLink.");
        largeProject.setBudget((double) 5000);
        largeProject.getMilestone().set(1991, 10, 11, 12, 0, 0);

        return largeProject;
    }

    public LargeProject basicLargeProjectExample2() {
        LargeProject largeProject = new LargeProject();

        largeProject.setName("Light Reporter");
        largeProject.setDescription("A lightweight application to report on the corporations database through TopLink.");
        largeProject.setBudget(100.98);
        largeProject.getMilestone().set(1999, 11, 25, 11, 40, 44);

        return largeProject;
    }

    public LargeProject basicLargeProjectExample3() {
        LargeProject largeProject = new LargeProject();

        largeProject.setName("TOPEmployee Management");
        largeProject.setDescription("A management application to report on the corporations database through TopLink.");
        largeProject.setBudget(4000.98);
        largeProject.getMilestone().set(1997, 10, 12, 1, 0, 0);

        return largeProject;
    }

    public LargeProject basicLargeProjectExample4() {
        LargeProject largeProject = new LargeProject();

        largeProject.setName("Enterprise System");
        largeProject.setDescription("A enterprise wide application to report on the corporations database through TopLink.");
        largeProject.setBudget(40.98);
        largeProject.getMilestone().set(1996, 8, 6, 6, 40, 44);

        return largeProject;
    }

    public LargeProject basicLargeProjectExample5() {
        LargeProject largeProject = new LargeProject();

        largeProject.setName("Problem Reporting System");
        largeProject.setDescription("A PRS application to report on the corporations database through TopLink.");
        largeProject.setBudget(101.98);
        largeProject.getMilestone().set(1997, 9, 6, 1, 40, 44);

        return largeProject;
    }

    public SmallProject basicSmallProjectExample1() {
        return new SmallProject("Enterprise", "A enterprise wide application to report on the corporations database through TopLink.");
    }

    public SmallProject basicSmallProjectExample10() {
        return new SmallProject("Staff Query Tool", "A tool to help staff query various things.");
    }

    public SmallProject basicSmallProjectExample2() {
        return new SmallProject("Sales Reporter", "A reporting application using JDK to report on the corporations database through TopLink.");
    }

    public SmallProject basicSmallProjectExample3() {
        return new SmallProject("TOP-Employee Manager", "A management application to report on the corporations database through TopLink.");
    }

    public SmallProject basicSmallProjectExample4() {
        return new SmallProject("Problem Reporter", "A PRS application to report on the corporations database through TopLink.");
    }

    public SmallProject basicSmallProjectExample5() {
        return new SmallProject("Feather Reporter", "An extremely lightweight application to report on the corporations database through TopLink.");
    }

    public SmallProject basicSmallProjectExample6() {
        return new SmallProject("Makework", "A makework project.");
    }

    public SmallProject basicSmallProjectExample7() {
        return new SmallProject("Marketing Query Tool", "A tool to help marketing query various things.");
    }

    public SmallProject basicSmallProjectExample8() {
        return new SmallProject("Shipping Query Tool", "A tool to help shipping query various things.");
    }

    public SmallProject basicSmallProjectExample9() {
        return new SmallProject("Accounting Query Tool", "A tool to help accounting query various things.");
    }

    private void addManagedEmployees(int managerIndex, int[] employeeIndeces) {
        Employee manager = this.employees[managerIndex];

        if (manager.getManagedEmployees().isEmpty()) {
            for (int index = 0; index < employeeIndeces.length; index++) {
                manager.addManagedEmployee(this.employees[employeeIndeces[index]]);
            }
        }
    }

    private void setJobTitle(int employeeIndex, int jobIndex) {
        Employee employee = this.employees[employeeIndex];

        employee.setJobTitle(this.jobTitles[jobIndex]);
    }

    private void addProjects(int empIndex, int[] smallProjIndeces, int[] largeProjIndeces) {
        Employee employee = this.employees[empIndex];

        for (int index = 0; index < smallProjIndeces.length; index++) {
            employee.addProject(this.smallProjects[smallProjIndeces[index]]);
        }

        for (int index = 0; index < largeProjIndeces.length; index++) {
            employee.addProject(this.largeProjects[largeProjIndeces[index]]);
        }
    }

    /**
     * Register all of the population in the provided EntityManager to be
     * persisted This method should only be called from within a test case. It
     * asserts that the provided EntityManager is in a transaction and that the
     * database tables are empty.
     */
    public void persistAll(EntityManager em) {
        System.out.println("Persisting samples objects.");
        
        assert(em.getTransaction().isActive());

        // Verify that the database tables are empty
        assertCount(em, Employee.class, 0);
        assertCount(em, Address.class, 0);
        assertCount(em, PhoneNumber.class, 0);
        assertCount(em, Project.class, 0);
        assertCount(em, JobTitle.class, 0);

        for (int index = 0; index < this.jobTitles.length; index++) {
            em.persist(this.jobTitles[index]);
        }
        for (int index = 0; index < this.employees.length; index++) {
            em.persist(this.employees[index]);
        }
        for (int index = 0; index < this.smallProjects.length; index++) {
            em.persist(this.smallProjects[index]);
        }
        for (int index = 0; index < this.largeProjects.length; index++) {
            em.persist(this.largeProjects[index]);
        }

        System.out.println("Flushing to database.");
        em.flush();
        
        System.out.println("Verifying populate.");
        verifyCounts(em);
    }

    public void verifyCounts(EntityManager em) {
        assertCount(em, Employee.class, this.employees.length);
        assertCount(em, Address.class, this.employees.length);
        assertCount(em, Project.class, this.smallProjects.length + this.largeProjects.length);
        assertCount(em, JobTitle.class, this.jobTitles.length);
    }

    /**
     * Verify that the provided entity type has no rows in the database using a
     * native ReportQuery.
     * 
     * @param entityClass
     * @param count
     */
    public void assertCount(EntityManager em, Class entityClass, int count) {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery criteria = cb.createQuery();
        Root entity = criteria.from(entityClass);
        criteria.select(cb.count(entity));
        Query query = em.createQuery(criteria);

        Long dbCount = (Long)query.getSingleResult();
        assert(count == dbCount.intValue());
    }

}
