/*
 * Copyright (c) 1998, 2018 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:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.proxyindirection;

import java.util.Vector;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.framework.TestSystem;

public class ProxyIndirectionSystem extends TestSystem {
    public ProxyIndirectionSystem() {
        project = new ProxyIndirectionProject();
    }

    public void addDescriptors(DatabaseSession session) {
        Vector descriptors = new Vector();
        if (project == null) {
            project = new ProxyIndirectionProject();
        }

        (session).addDescriptors(project);
    }

    public void createTables(DatabaseSession session) {
        ProxyIndirectionTableCreator creator = new ProxyIndirectionTableCreator();
        creator.replaceTables(session);
    }

    public void populate(DatabaseSession session) {
        // ===================================
        // Create model objects
        // ===================================
        Employee emp1 = new EmployeeImpl();
        emp1.setFirstName("Rick");
        emp1.setLastName("Barkhouse");
        emp1.setGender("Male");
        emp1.setAge(24);
        Employee emp2 = new EmployeeImpl();
        emp2.setFirstName("Angie");
        emp2.setLastName("MacIvor");
        emp2.setGender("Female");
        emp2.setAge(24);
        Employee emp3 = new EmployeeImpl();
        emp3.setFirstName("James");
        emp3.setLastName("Sutherland");
        emp3.setGender("Male");
        emp3.setAge(28);

        Address add1 = new AddressImpl();
        add1.setStreet("509-171 Lees Ave.");
        add1.setCity("Ottawa");
        add1.setState("ON");
        add1.setCountry("Canada");
        add1.setPostalCode("K1S 5P3");
        Address add2 = new AddressImpl();
        add2.setStreet("14421 Baseline Rd.");
        add2.setCity("Ottawa");
        add2.setState("ON");
        add2.setCountry("Canada");
        add2.setPostalCode("K1T 5A1");

        Cubicle cube1 = new CubicleImpl();
        cube1.setLength(5.7f);
        cube1.setWidth(5.7f);
        cube1.setHeight(5.0f);
        Cubicle cube2 = new CubicleImpl();
        cube2.setLength(6.4f);
        cube2.setWidth(5.7f);
        cube2.setHeight(5.0f);
        Cubicle cube3 = new CubicleImpl();
        cube3.setLength(8.4f);
        cube3.setWidth(8.7f);
        cube3.setHeight(5.0f);

        Project project1 = new ProjectImpl();
        project1.setName("Support Tracker 3");
        project1.setDescription("Customer support software to keep track of support e-mail");
        LargeProject project2 = new LargeProjectImpl();
        project2.setName("Virtual Coffee Machine");
        project2.setDescription("Espresso machine simulator written in Java");
        project2.setBudget(125000);
        project2.setInvestor("Second Cup Coffee Co.");

        EmailImpl email1 = new EmailImpl();
        email1.setIsPublic(true);
        email1.setWantsHTMLMail(true);
        email1.setUsername("rick_barkhouse");
        email1.setDomain("yahoo.ca");
        EmailImpl email2 = new EmailImpl();
        email2.setIsPublic(true);
        email2.setWantsHTMLMail(false);
        email2.setUsername("amacivor");
        email2.setDomain("sympatico.ca");
        PhoneImpl phone1 = new PhoneImpl();
        phone1.setIsPublic(false);
        phone1.setNumber("613-123-4567");
        phone1.setType(PhoneImpl.CELL);

        DesktopComputer comp1 = new DesktopComputerImpl();
        comp1.setDescription("Compaq Pentium 200");
        comp1.setSerialNumber("CP18176-187262");
        comp1.setMoniterSize(21);

        DesktopComputer comp2 = new DesktopComputerImpl();
        comp2.setDescription("Acer PentiumII 300");
        comp2.setSerialNumber("2876-298769232736");
        comp2.setMoniterSize(19);

        DesktopComputer comp3 = new DesktopComputerImpl();
        comp3.setDescription("Micron PentiumII 450");
        comp3.setSerialNumber("OU812-URABUTLN");
        comp3.setMoniterSize(17);

        // ===================================
        // Register and make relationships
        // ===================================
        UnitOfWork uow = session.acquireUnitOfWork();

        uow.registerNewObject(cube1);
        uow.registerNewObject(cube2);
        uow.registerNewObject(cube3);
        uow.assignSequenceNumbers();

        cube1.setEmployee(emp1);
        cube2.setEmployee(emp2);
        cube3.setEmployee(emp3);
        cube1.setComputer(comp1);
        cube2.setComputer(comp2);
        cube3.setComputer(comp3);

        emp1.setAddress(add1);
        emp1.setProject(project1);
        emp1.setLargeProject(project2);
        emp1.setCubicleID(cube1.getID());
        emp1.setContact(email1);
        emp2.setAddress(add1);
        emp2.setProject(project2);
        emp2.setCubicleID(cube2.getID());
        emp2.setContact(email2);
        emp3.setAddress(add2);
        emp3.setCubicleID(cube3.getID());
        emp3.addManagedEmployee(emp1);
        emp3.addManagedEmployee(emp2);
        emp3.setContact(phone1);

        uow.commit();
    }
}
