/*
 * 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:
//     ailitchev - jpa 2.0 element collections support
package org.eclipse.persistence.testing.models.aggregate;

import java.io.*;
import java.util.*;

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

public class Builder implements Serializable {
    private String firstName;
    private String lastName;
    private java.math.BigDecimal id;
    private List houses;
    private List customers;
    private List vehicles;

    public Builder() {
        super();
        houses = new ArrayList(2);
        customers = new ArrayList(2);
        vehicles = new ArrayList(2);
    }

    public void addCustomer(Customer customer) {
        getCustomers().add(customer);
    }

    public void addHouse(House house) {
        getHouses().add(house);
    }

    public void addVehicle(Vehicle vehicle) {
        getVehicles().add(vehicle);
    }

    public static Builder example1() {
        Builder example1 = new Builder();

        example1.setFirstName("Micheal");
        example1.setLastName("Jordan");

        example1.addCustomer(Customer.example1());
        example1.addCustomer(Customer.example2());

        example1.addHouse(SingleHouse.example1());
        example1.addHouse(TownHouse.example3());

        example1.addVehicle(Car.example1());
        example1.addVehicle(Car.example2());
        example1.addVehicle(Car.example3());
        example1.addVehicle(Bicycle.example1());
        example1.addVehicle(Bicycle.example2());

        return example1;
    }

    public List getCustomers() {
        return customers;
    }

    public String getFirstName() {
        return firstName;
    }

    public List getHouses() {
        return houses;
    }

    public java.math.BigDecimal getId() {
        return id;
    }

    public String getLastName() {
        return lastName;
    }

    public List getVehicles() {
        return vehicles;
    }

    public void removeCustomer(Customer customer) {
        getCustomers().remove(customer);
    }

    public void removeHouse(House house) {
        getHouses().remove(house);
    }

    public void removeVehicle(Vehicle vehicle) {
        getVehicles().remove(vehicle);
    }

    public void setCustomers(List customers) {
        this.customers = customers;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setHouses(List houses) {
        this.houses = houses;
    }

    public void setId(java.math.BigDecimal id) {
        this.id = id;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public void setVehicles(List vehicles) {
        this.vehicles = vehicles;
    }

    /**
     * Return a platform independent definition of the database table.
     */
    public static TableDefinition tableDefinition() {
        TableDefinition definition = new TableDefinition();

        definition.setName("BUILDER");

        definition.addIdentityField("BUILDER_ID", java.math.BigDecimal.class, 15);
        definition.addField("FNAME", String.class, 30);
        definition.addField("LNAME", String.class, 30);
        definition.addField("VERSION", java.math.BigDecimal.class, 15);
        return definition;
    }

    /**
     * Return a platform independent definition of the database table.
     */
    public static TableDefinition houseTableDefinition() {
        TableDefinition definition = House.tableDefinition();

        definition.setName("BUILDER_HOUSE");

        for(int i=0; i < definition.getFields().size(); i++) {
            FieldDefinition field = definition.getFields().get(i);
            if(field.getName().equals("AGENT_ID")) {
                field.setName("BUILDER_ID");
                break;
            }
        }
        return definition;
    }

    /**
     * Return a platform independent definition of the database table.
     */
    public static TableDefinition singleHouseTableDefinition() {
        TableDefinition definition = SingleHouse.tableDefinition();

        definition.setName("BUILDER_SINGLE_HOUSE");

        for(int i=0; i < definition.getFields().size(); i++) {
            FieldDefinition field = definition.getFields().get(i);
            if(field.getName().equals("AGENT_ID")) {
                field.setName("BUILDER_ID");
                break;
            }
        }
        return definition;
    }

    /**
     * Return a platform independent definition of the database table.
     */
    public static TableDefinition sellingPointTableDefinition() {
        TableDefinition definition = SellingPoint.tableDefinition();

        definition.setName("BUILDER_SELLING_POINT");

        for(int i=0; i < definition.getFields().size(); i++) {
            FieldDefinition field = definition.getFields().get(i);
            if(field.getName().equals("AGENT_ID")) {
                field.setName("BUILDER_ID");
                break;
            }
        }
        return definition;
    }

    /**
     * Return a platform independent definition of the database table.
     */
    public static TableDefinition customerTableDefinition() {
        TableDefinition definition = Customer.tableDefinition();

        definition.setName("BUILDER_CUSTOMER");

        for(int i=0; i < definition.getFields().size(); i++) {
            FieldDefinition field = definition.getFields().get(i);
            if(field.getName().equals("AGENT_ID")) {
                field.setName("BUILDER_ID");
                break;
            }
        }
        return definition;
    }

    /**
     * Return a platform independent definition of the database table.
     */
    public static TableDefinition dependantTableDefinition() {
        TableDefinition definition = Dependant.tableDefinition();

        definition.setName("BUILDER_DEPENDANT");

        return definition;
    }

    /**
     * Return a platform independent definition of the database table.
     */
    public static TableDefinition vehicleTableDefinition() {
        TableDefinition definition = Vehicle.tableDefinition();

        definition.setName("BUILDER_VEHICLE");

        for(int i=0; i < definition.getFields().size(); i++) {
            FieldDefinition field = definition.getFields().get(i);
            if(field.getName().equals("ID")) {
                field.setName("BUILDER_ID");
                field.setIsPrimaryKey(false);
                break;
            }
        }

        return definition;
    }
}
