/*
 * Copyright (c) 1998, 2020 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.mapping;

import org.eclipse.persistence.tools.schemaframework.FieldDefinition;
import org.eclipse.persistence.tools.schemaframework.ForeignKeyConstraint;
import org.eclipse.persistence.tools.schemaframework.TableDefinition;

public class LegacyTableMaker extends org.eclipse.persistence.tools.schemaframework.TableCreator {

    public LegacyTableMaker() {
        setName("LegacyTestCase");

        buildMUL_ADDRTable();
        buildMUL_EMPTable();
        buildMUL_CTRYTable();
    }

    protected void buildMUL_ADDRTable() {
        TableDefinition tabledefinition = new TableDefinition();

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

        // SECTION: FIELD
        FieldDefinition field = new FieldDefinition();
        field.setName("CITY");
        field.setTypeName("VARCHAR");
        field.setSize(10);
        field.setShouldAllowNull(true);
        field.setIsPrimaryKey(false);
        field.setUnique(false);
        field.setIsIdentity(false);
        tabledefinition.addField(field);

        // SECTION: FIELD
        FieldDefinition field1 = new FieldDefinition();
        field1.setName("CNTRY_ID");
        field1.setTypeName("NUMERIC");
        field1.setSize(5);
        field1.setShouldAllowNull(true);
        field1.setIsPrimaryKey(false);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        tabledefinition.addField(field1);

        // SECTION: FIELD
        FieldDefinition field2 = new FieldDefinition();
        field2.setName("PROVINCE");
        field2.setTypeName("VARCHAR");
        field2.setSize(10);
        field2.setShouldAllowNull(true);
        field2.setIsPrimaryKey(false);
        field2.setUnique(false);
        field2.setIsIdentity(false);
        tabledefinition.addField(field2);

        // SECTION: FIELD
        FieldDefinition field3 = new FieldDefinition();
        field3.setName("ADDR_ID");
        field3.setTypeName("NUMERIC");
        field3.setSize(10);
        field3.setShouldAllowNull(false);
        field3.setIsPrimaryKey(true);
        field3.setUnique(false);
        field3.setIsIdentity(false);
        tabledefinition.addField(field3);

        ForeignKeyConstraint foreignKeyADDRESS_COUNTRY = new ForeignKeyConstraint();
        foreignKeyADDRESS_COUNTRY.setName("ADDRESS_COUNTRY");
        foreignKeyADDRESS_COUNTRY.setTargetTable("MUL_CTRY");
        foreignKeyADDRESS_COUNTRY.addSourceField("CNTRY_ID");
        foreignKeyADDRESS_COUNTRY.addTargetField("CNTRY_ID");
        tabledefinition.addForeignKeyConstraint(foreignKeyADDRESS_COUNTRY);

        addTableDefinition(tabledefinition);
    }

    protected void buildMUL_CTRYTable() {
        TableDefinition tabledefinition = new TableDefinition();

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

        // SECTION: FIELD
        FieldDefinition field = new FieldDefinition();
        field.setName("COUNTRY");
        field.setTypeName("VARCHAR");
        field.setSize(10);
        field.setShouldAllowNull(true);
        field.setIsPrimaryKey(false);
        field.setUnique(false);
        field.setIsIdentity(false);
        tabledefinition.addField(field);

        // SECTION: FIELD
        FieldDefinition field1 = new FieldDefinition();
        field1.setName("CNTRY_ID");
        field1.setTypeName("NUMERIC");
        field1.setSize(5);
        field1.setShouldAllowNull(false);
        field1.setIsPrimaryKey(true);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        tabledefinition.addField(field1);
        addTableDefinition(tabledefinition);

    }

    protected void buildMUL_EMPTable() {
        TableDefinition tabledefinition = new TableDefinition();

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

        // SECTION: FIELD
        FieldDefinition field = new FieldDefinition();
        field.setName("FIRST_NAME");
        field.setTypeName("VARCHAR");
        field.setSize(10);
        field.setShouldAllowNull(true);
        field.setIsPrimaryKey(false);
        field.setUnique(false);
        field.setIsIdentity(false);
        tabledefinition.addField(field);

        // SECTION: FIELD
        FieldDefinition field1 = new FieldDefinition();
        field1.setName("EMP_ID");
        field1.setTypeName("NUMERIC");
        field1.setSize(10);
        field1.setShouldAllowNull(false);
        field1.setIsPrimaryKey(true);
        field1.setUnique(false);
        field1.setIsIdentity(false);
        tabledefinition.addField(field1);

        // SECTION: FIELD
        FieldDefinition field2 = new FieldDefinition();
        field2.setName("LAST_NAME");
        field2.setTypeName("VARCHAR");
        field2.setSize(10);
        field2.setShouldAllowNull(true);
        field2.setIsPrimaryKey(false);
        field2.setUnique(false);
        field2.setIsIdentity(false);
        tabledefinition.addField(field2);

        // SECTION: FIELD
        FieldDefinition field3 = new FieldDefinition();
        field3.setName("SEX");
        field3.setTypeName("VARCHAR");
        field3.setSize(10);
        field3.setShouldAllowNull(true);
        field3.setIsPrimaryKey(false);
        field3.setUnique(false);
        field3.setIsIdentity(false);
        tabledefinition.addField(field3);

        // SECTION: FIELD
        FieldDefinition field4 = new FieldDefinition();
        field4.setName("ADDR_ID");
        field4.setTypeName("NUMERIC");
        field4.setSize(10);
        field4.setShouldAllowNull(true);
        field4.setIsPrimaryKey(false);
        field4.setUnique(false);
        field4.setIsIdentity(false);
        tabledefinition.addField(field4);
        addTableDefinition(tabledefinition);

        ForeignKeyConstraint foreignKeyEMPLOYEE_ADDRESS = new ForeignKeyConstraint();
        foreignKeyEMPLOYEE_ADDRESS.setName("EMPLOYEE_ADDRESS");
        foreignKeyEMPLOYEE_ADDRESS.setTargetTable("MUL_ADDR");
        foreignKeyEMPLOYEE_ADDRESS.addSourceField("ADDR_ID");
        foreignKeyEMPLOYEE_ADDRESS.addTargetField("ADDR_ID");
        tabledefinition.addForeignKeyConstraint(foreignKeyEMPLOYEE_ADDRESS);
    }
}
