/*
 * 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:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.models.collections;

import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.testing.models.collections.CollectionsProject;
import org.eclipse.persistence.tools.schemaframework.*;
import org.eclipse.persistence.testing.framework.*;

public class CollectionsSystem extends TestSystem {
    public CollectionsSystem() {
        project = new CollectionsProject();
    }

    @Override
    public void addDescriptors(DatabaseSession session) {
        if (project == null) {
            project = new CollectionsProject();
        }
        session.addDescriptors(project);
    }

    @Override
    public void createTables(DatabaseSession session) {
        SchemaManager schemaManager = new SchemaManager(session);

        schemaManager.replaceObject(org.eclipse.persistence.testing.models.collections.MenuItem.tableDefinition());
        schemaManager.replaceObject(Menu.tableDefinition());
        schemaManager.replaceObject(org.eclipse.persistence.testing.models.collections.Person.tableDefinition());
        schemaManager.replaceObject(Location.tableDefinition());
        schemaManager.replaceObject(Location.relationTableDefinition());
        schemaManager.replaceObject(Location.relation2TableDefinition());
        schemaManager.replaceObject(Diner.relationTableDefinition());
        schemaManager.replaceObject(Restaurant.tableDefinition());
        schemaManager.replaceObject(Restaurant.sloganTableDefinition());
        schemaManager.replaceObject(Restaurant.servicesTableDefinition());
        schemaManager.replaceObject(Restaurant.licensesTableDefinition());
        schemaManager.createSequences();
    }

    @Override
    public void populate(DatabaseSession session) {
        PopulationManager manager = PopulationManager.getDefaultManager();
        UnitOfWork uow = session.acquireUnitOfWork();

        // Locations
        Location location1 = Location.example1();
        Location location2 = Location.example2();
        Location location3 = Location.example3();
        Location location4 = Location.example4();
        Location location5 = Location.example5();
        Location location6 = Location.example6();

        //Diners
        Diner diner1 = Diner.example1();
        Diner diner2 = Diner.example2();
        Diner diner3 = Diner.example3();

        // Register restaurants.
        Restaurant instance1 = Restaurant.example1();
        instance1.addLocation(location1);
        instance1.addLocation(location2);
        instance1.addDiner(diner1);
        instance1.addDiner(diner2);
        manager.registerObject(instance1, "example1");

        Restaurant instance2 = Restaurant.example2();
        instance2.addLocation(location2);
        instance2.addLocation(location3);
        instance2.addLocation(location4);
        instance2.addDiner(diner2);
        instance2.addDiner(diner3);
        manager.registerObject(instance2, "example2");

        uow.registerObject(instance1);
        uow.registerObject(instance2);
        uow.commit();

    }
}
