/*
 * 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.tests.history;

import org.eclipse.persistence.testing.models.employee.relational.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.tools.history.*;
import org.eclipse.persistence.tools.schemaframework.SchemaManager;
import org.eclipse.persistence.testing.tests.workbenchintegration.*;

/**
 * <b>Purpose:</b>A specialized Employee System for testing generic historical schema support.
 * <p>
 * This EmployeeSystem creates descriptors with history policies configured, and
 * generates a historical schema on the database when tables are created.
 * <p>
 * The specialized descriptors are effected using the HistoryFacade, and two
 * options are to write those descriptors to a Project xml file and read them back,
 * or to write them to a Project Class generated file and compile and load the
 * class on the fly.  The latter two are for testing the workbench integration.
 * @author Stephen McRitchie
 * @since 10.0.3
 */
public class HistoricalEmployeeSystem extends EmployeeSystem {
    // Allow history tests to be run with a hard coded project, a project
    // loaded from an xml file, or one loaded from a project class file
    // which is generated on the fly.
    int mode;

    public HistoricalEmployeeSystem(int mode) {
        this("MWIntegrationTestHistoricalEmployeeProject", mode);
    }

    public HistoricalEmployeeSystem(String fileName, int mode) {
        this.mode = mode;
        initializeProject(getInitialProject(), fileName);
    }

    public void initializeProject(org.eclipse.persistence.sessions.Project initialProject, String fileName) {
        if (mode == HistoryTestModel.BASIC) {
            project = initialProject;
        } else if (mode == HistoryTestModel.PROJECT_XML) {
            project = WorkbenchIntegrationSystemHelper.buildProjectXML(initialProject, fileName);
        } else if (mode == HistoryTestModel.PROJECT_CLASS_GENERATED) {
            project = WorkbenchIntegrationSystemHelper.buildProjectClass(initialProject, fileName);
        }
    }

    public org.eclipse.persistence.sessions.Project getInitialProject() {
        org.eclipse.persistence.sessions.Project initialProject = new EmployeeProject();
        HistoryFacade.generateHistoryPolicies(initialProject);
        return initialProject;
    }

    @Override
    public void createTables(DatabaseSession session) {
        if (!SchemaManager.FAST_TABLE_CREATOR) {
            if (session.getPlatform().isOracle()) {

                executeCall(session, "drop table PHONE CASCADE CONSTRAINTS");
                executeCall(session, "drop table RESPONS CASCADE CONSTRAINTS");
                executeCall(session, "drop table SALARY CASCADE CONSTRAINTS");
                executeCall(session, "drop table PROJ_EMP CASCADE CONSTRAINTS");
                executeCall(session, "drop table LPROJECT CASCADE CONSTRAINTS");
                executeCall(session, "drop table PROJECT CASCADE CONSTRAINTS");
                executeCall(session, "drop table EMPLOYEE CASCADE CONSTRAINTS");
                executeCall(session, "drop table ADDRESS CASCADE CONSTRAINTS");
            } else {
                if (session.getPlatform().isMySQL()) {
                    executeCall(session, "SET FOREIGN_KEY_CHECKS = 0");
                }
                executeCall(session, "drop table PHONE");
                executeCall(session, "drop table RESPONS");
                executeCall(session, "drop table SALARY");
                executeCall(session, "drop table PROJ_EMP");
                executeCall(session, "drop table LPROJECT");
                executeCall(session, "drop table PROJECT");
                executeCall(session, "drop table EMPLOYEE");
                executeCall(session, "drop table ADDRESS");
                if (session.getPlatform().isMySQL()) {
                    executeCall(session, "SET FOREIGN_KEY_CHECKS = 1");
                }
            }
        }

        EmployeeTableCreator creator = new EmployeeTableCreator();
        HistoryFacade.generateHistoricalTableDefinitions(creator, session);
        // reset creator as it might have been set by tests that used
        // the non-historical table definitions
        creator.resetFastTableCreator();
        creator.replaceTables(session);
    }

    private void executeCall(DatabaseSession session, String call) {
        try {
            session.executeNonSelectingCall(new SQLCall(call));
        } catch (Exception e) {
            // ignore exception
        }
    }
}
