/*
 * 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:
//     02/01/2012-2.4 Chris Delahunt
//       - 368365: add DDL support to alter existing tables to add missing fields
package org.eclipse.persistence.testing.tests.jpa.ddlgeneration;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceException;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.eclipse.persistence.exceptions.DatabaseException;
import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl;
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.tools.schemaframework.DefaultTableGenerator;
import org.eclipse.persistence.tools.schemaframework.TableCreator;

public class DDLGenerationExtendTablesJUnitTestSuite extends
        DDLGenerationJUnitTestSuite {

    public DDLGenerationExtendTablesJUnitTestSuite() {
    }

    public DDLGenerationExtendTablesJUnitTestSuite(String name) {
        super(name);
        setPuName(DDL_PU);
    }

    /**
     * The setup is done as a test, both to record its failure, and to allow execution in the server.
     */
    @Override
    public void testSetup() {
        // Create the EM.  This might unnecessarily drop and create the tables
        EntityManager em = createEntityManager(DDL_PU);
        DatabaseSessionImpl session = getDatabaseSession(DDL_PU);

        TableCreator defaultTableCreator = new DefaultTableGenerator(session.getProject(), true).generateDefaultTableCreator();
        defaultTableCreator.setIgnoreDatabaseException(true);
        //drop the tables using the current project
        defaultTableCreator.dropTables(session);

        //check that the tables do not exist:
        Exception exception = null;
        try {
            em.createQuery("Select c from Course c").getResultList();
        } catch (DatabaseException caught){
            //we expect an exception since the table should not exist, but do not know what exception the database might throw.
            exception = caught;
        } catch (PersistenceException e){
            exception = e;
        }
        assertNotNull("setup failed because a query on a drop table did not throw an exception.", exception);

        //create some empty tables so that we can test they are altered correctly later.
        TableCreator tbCreator = new EmptyTableCreator();
        tbCreator.createTables(session);

        //refresh the metadata with the create-or-alter table to create the remaining tables and alter the ones created above.
        //testing later on just verifies that this worked correctly.
        Map properties = new HashMap();
        properties.put(PersistenceUnitProperties.DDL_GENERATION, PersistenceUnitProperties.CREATE_OR_EXTEND);
        //create-or-extend only works on the database
        properties.put(PersistenceUnitProperties.DDL_GENERATION_MODE, PersistenceUnitProperties.DDL_DATABASE_GENERATION);
        //this causes DDL generation to occur on refreshMetadata rather than wait until an em is obtained
        properties.put(PersistenceUnitProperties.DEPLOY_ON_STARTUP, "true");
        // JEE requires a transaction to keep the em open.
        beginTransaction(em);
        JpaHelper.getEntityManagerFactory(em).refreshMetadata(properties);
        commitTransaction(em);
        closeEntityManager(em);
        clearCache(DDL_PU);

    }

    public static Test suite() {
        if (System.getProperty("server.platform") != null) {
            // "MulitPU-1" is the persistence unit name used on servers
            DDL_PU = "MulitPU-1";
        }
        TestSuite suite = new TestSuite();
        suite.setName("DDLCreateAndAlterTablesTestSuite");

        // 'create-or-extend-tables' cannot be tested properly if 'toggle-fast-table-creator' is set as true.
        // DELETE FROM TABLE is executed instead of DROP TABLE / CREATE TABLE when 'toggle-fast-table-creator' is set as true.
        // Skip this test suite if 'toggle-fast-table-creator' is set as true. (bug 372179)
        if (Boolean.getBoolean("eclipselink.test.toggle-fast-table-creator")) {
            return suite;
        }

        suite.addTest(new DDLGenerationExtendTablesJUnitTestSuite("testSetup"));
        List<String> tests = new ArrayList<String>();
        tests.add("testDDLPkConstraintErrorIncludingRelationTableColumnName");
        tests.add("testOptionalPrimaryKeyJoinColumnRelationship");
        tests.add("testPrimaryKeyJoinColumns");
        tests.add("testDDLEmbeddableMapKey");
        tests.add("testDDLAttributeOverrides");
        tests.add("testDDLAttributeOverridesOnElementCollection");
        tests.add("testDDLUniqueKeysAsJoinColumns");
        tests.add("testDDLUniqueConstraintsByAnnotations");
        tests.add("testDDLUniqueConstraintsByXML");
        tests.add("testDDLSubclassEmbeddedIdPkColumnsInJoinedStrategy");
        tests.add("testBug241308");
        tests.add("testDDLUnidirectionalOneToMany");
        tests.add("testCascadeMergeOnManagedEntityWithOrderedList");
        tests.add("testDirectCollectionMapping");
        tests.add("testAggregateCollectionMapping");
        tests.add("testOneToManyMapping");
        tests.add("testUnidirectionalOneToManyMapping");
        tests.add("testManyToManyMapping");
        tests.add("testManyToManyWithMultipleJoinColumns");
        tests.add("testEmbeddedManyToMany");
        tests.add("testEmbeddedOneToOne");
        tests.add("testAssociationOverrideToEmbeddedManyToMany");
        tests.add("testDeleteObjectWithEmbeddedManyToMany");
        tests.add("testLAZYLOBWithEmbeddedId");
        tests.add("testElementMapOnEmbedded");
        if (! JUnitTestCase.isJPA10()) {
            tests.add("testCreateMafiaFamily707");
            tests.add("testCreateMafiaFamily007");
            tests.add("testValidateMafiaFamily707");
            tests.add("testValidateMafiaFamily007");
        }
        tests.add("testSimpleSelectFoo");

        for (String test : tests) {
            suite.addTest(new DDLGenerationExtendTablesJUnitTestSuite(test));
        }
        return suite;
    }
    public class EmptyTableCreator extends TableCreator {
        public EmptyTableCreator() {
            org.eclipse.persistence.tools.schemaframework.TableDefinition tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition();

            // SECTION: TABLE
            tabledefinition.setName("Countries");

            // SECTION: ID FIELD
            org.eclipse.persistence.tools.schemaframework.FieldDefinition field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
            field.setName("iso_code");
            field.setType(String.class);
            field.setSize(50);
            field.setShouldAllowNull(false);
            field.setIsPrimaryKey(true);
            field.setUnique(false);
            field.setIsIdentity(true);
            tabledefinition.addField(field);

            addTableDefinition(tabledefinition);

            // SECTION: TABLE
            tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition();
            tabledefinition.setName("DDL_EMP");

            // SECTION: ID FIELD
            field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
            field.setName("ID");
            field.setType(Integer.class);
            field.setShouldAllowNull(false);
            field.setIsPrimaryKey(true);
            field.setUnique(false);
            field.setIsIdentity(true);
            tabledefinition.addField(field);

            addTableDefinition(tabledefinition);

            // SECTION: TABLE
            tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition();
            tabledefinition.setName("DDL_COURSE");

            // SECTION: ID FIELD
            field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
            field.setName("ID");
            field.setType(Long.class);
            field.setShouldAllowNull(false);
            field.setIsPrimaryKey(true);
            field.setUnique(false);
            field.setIsIdentity(true);
            tabledefinition.addField(field);

            addTableDefinition(tabledefinition);

         // SECTION: TABLE
            tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition();
            tabledefinition.setName("Foos");

            // SECTION: ID FIELD
            field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
            field.setName("contact_id");
            field.setType(Integer.class);
            field.setShouldAllowNull(false);
            field.setIsPrimaryKey(true);
            field.setUnique(false);
            field.setIsIdentity(true);
            tabledefinition.addField(field);

            field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
            field.setName("ordinal_nbr");
            field.setType(Integer.class);
            field.setShouldAllowNull(false);
            field.setIsPrimaryKey(true);
            field.setUnique(false);
            field.setIsIdentity(true);
            tabledefinition.addField(field);

            addTableDefinition(tabledefinition);

         // SECTION: TABLE
            tabledefinition = new org.eclipse.persistence.tools.schemaframework.TableDefinition();
            tabledefinition.setName("DDL_CKENTA");

            // SECTION: ID FIELDS
            field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
            field.setName("SEQ");
            field.setType(Integer.class);
            field.setShouldAllowNull(false);
            field.setIsPrimaryKey(true);
            field.setUnique(false);
            field.setIsIdentity(true);
            tabledefinition.addField(field);

            field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
            field.setName("F_NAME");
            field.setType(String.class);
            field.setSize(64);
            field.setShouldAllowNull(false);
            field.setIsPrimaryKey(true);
            field.setUnique(false);
            field.setIsIdentity(true);
            tabledefinition.addField(field);

            field = new org.eclipse.persistence.tools.schemaframework.FieldDefinition();
            field.setName("L_NAME");
            field.setType(String.class);
            field.setSize(64);
            field.setShouldAllowNull(false);
            field.setIsPrimaryKey(true);
            field.setUnique(false);
            field.setIsIdentity(true);
            tabledefinition.addField(field);

            addTableDefinition(tabledefinition);
        }
    }

}
