/*
 * Copyright (c) 1998, 2021 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 v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//              dclarke - initial JPA Employee example using XML (bug 217884)
package org.eclipse.persistence.testing.models.jpa.performance2;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Query;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Root;

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

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

    public static final 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(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.
     *
     */
    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());
    }

}
