/*
 * Copyright (c) 1998, 2018 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;
    }
}
