/*
 * Copyright 2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.jdo.tck.pc.company;

import java.math.BigDecimal;

import java.util.Date;

import javax.jdo.PersistenceManager;

/*
 * This class is the company factory that uses constructors of the
 * concrete classes.
 */
public  class CompanyFactoryConcreteClass implements CompanyFactory {

    /** */
    public static final Class[] tearDownClasses = new Class[] {
        DentalInsurance.class, MedicalInsurance.class,
        PartTimeEmployee.class, FullTimeEmployee.class,  
        Project.class, Department.class, Company.class
    };

    public CompanyFactoryConcreteClass(PersistenceManager pm) {
    }

    public CompanyFactoryConcreteClass() {
    }

    public ICompany newCompany(long companyid, 
            String name, Date founded) {
        return new Company(companyid, name, founded);
    }

    public ICompany newCompany(long companyid, 
            String name, Date founded, IAddress addr) {
        return new Company(companyid, name, founded, addr);
    }

    public IAddress newAddress(long addrid, 
            String street, String city, String state, String zipcode, 
            String country) {
        return new Address(addrid, street, city, state, zipcode, country);
    }

    public IDentalInsurance newDentalInsurance(long insid, 
            String carrier, BigDecimal lifetimeOrthoBenefit) {
        return new DentalInsurance(insid, carrier, lifetimeOrthoBenefit);
    }

    public IDentalInsurance newDentalInsurance(long insid, 
            String carrier, IEmployee employee,
            BigDecimal lifetimeOrthoBenefit) {
        return new DentalInsurance(insid, carrier, lifetimeOrthoBenefit);
    }

    public IDepartment newDepartment(long deptid, String name) {
        return new Department(deptid, name);
    }

    public IDepartment newDepartment(long deptid, 
            String name, ICompany company) {
        return new Department(deptid, name, company);
    }

    public IDepartment newDepartment(long deptid, 
            String name, ICompany company, IEmployee employeeOfTheMonth) {
        return new Department(deptid, name, company, employeeOfTheMonth);
    }

    public IFullTimeEmployee newFullTimeEmployee(long personid, 
            String first, String last, String middle, 
            Date born, Date hired, double sal) {
        return new FullTimeEmployee(personid, first, last, middle,
                born, hired, sal);
    }

    public IFullTimeEmployee newFullTimeEmployee(long personid, 
            String first, String last, String middle, 
            Date born, IAddress addr, Date hired, double sal) {
        return new FullTimeEmployee(personid, first, last, middle,
                born, addr, hired, sal);
    }

    public IMedicalInsurance newMedicalInsurance(long insid, 
            String carrier, String planType) {
        return new MedicalInsurance(insid, carrier, planType);
    }

    public IMedicalInsurance newMedicalInsurance(long insid, 
            String carrier, IEmployee employee, String planType) {
        return new MedicalInsurance(insid, carrier, planType);
    }

    public IPartTimeEmployee newPartTimeEmployee(long personid, 
            String first, String last, String middle, 
            Date born, Date hired, double wage ) {
        return new PartTimeEmployee(personid, first, last, middle,
                born, hired, wage);
    }

    public IPartTimeEmployee newPartTimeEmployee(long personid, 
            String first, String last, String middle, 
            Date born, IAddress addr, Date hired, double wage) {
        return new PartTimeEmployee(personid, first, last, middle, 
                born, addr, hired, wage);
    } 

    public IPerson newPerson(long personid, 
            String firstname, String lastname, String middlename, 
            Date birthdate) {
        return new Person(personid, firstname, lastname, middlename,
                birthdate);
    }

    public IPerson newPerson(long personid, 
            String firstname, String lastname, String middlename, 
            Date birthdate, IAddress address) {
        return new Person(personid, firstname, lastname, middlename, 
                birthdate, address);
    }

    public IProject newProject(long projid, String name, 
            BigDecimal budget) {
        return new Project(projid, name, budget);
    }

    public Class[] getTearDownClasses() {
        return tearDownClasses;
    }
}
