package nl.amis.jpa;

import java.util.ArrayList;

import nl.amis.jpa.entities.Departments;

import org.eclipse.persistence.mappings.structures.ObjectRelationalDataTypeDescriptor;
import org.eclipse.persistence.platform.database.jdbc.JDBCTypes;
import org.eclipse.persistence.platform.database.oracle.plsql.PLSQLCollection;
import org.eclipse.persistence.platform.database.oracle.plsql.PLSQLrecord;


public class DepartmentUtils {
  public DepartmentUtils() {
  }

  private static String departmentPLSQLRecType = "HR_DEPARTMENTS.department_rec_type";
  private static String departmentPLSQLTabType = "HR_DEPARTMENTS.department_tab_type";

  private static String departmentRecType = "HR_DEPARTMENT_ROW_TYPE";
  private static String departmentTabType = "HR_DEPARTMENT_TYPE";

  private static String departmentIdColumn = "DEPARTMENT_ID";
  private static String departmentNameColumn = "DEPARTMENT_NAME";
  private static String departmentLocationColumn = "LOCATION_ID";
  private static String departmentManagerColumn = "MANAGER_ID";

  private static String departmentIdEntity = "departmentId";
  private static String departmentNameEntity = "departmentName";
  private static String departmentLocationEntity = "locationId";
  private static String departmentManagerEntity= "managerId";


  public static PLSQLrecord departmentRecord() {
    PLSQLrecord record = new PLSQLrecord();
    record.setTypeName(departmentPLSQLRecType);
    record.setCompatibleType(departmentRecType);
    record.setJavaType(Departments.class);
    record.addField(departmentIdColumn, 
                    JDBCTypes.NUMERIC_TYPE, 4,0);
    record.addField(departmentNameColumn, 
                    JDBCTypes.VARCHAR_TYPE, 30);
    record.addField(departmentLocationColumn, 
                    JDBCTypes.NUMERIC_TYPE, 4, 0);
    record.addField(departmentManagerColumn, 
                    JDBCTypes.NUMERIC_TYPE, 6, 0);
    return record;
  }

  public static PLSQLCollection departmentCollection() {
    PLSQLCollection collection = new PLSQLCollection();
    collection.setTypeName(departmentPLSQLTabType);
    collection.setCompatibleType(departmentTabType);
    collection.setJavaType(ArrayList.class);
    
    // add the department PLSQLRecord
    collection.setNestedType(departmentRecord());
    return collection;
  }

  public static ObjectRelationalDataTypeDescriptor departmentDescriptor(){
      
    ObjectRelationalDataTypeDescriptor descriptor =
        new ObjectRelationalDataTypeDescriptor();
  
    descriptor.setJavaClass(Departments.class);
    descriptor.setTableName(departmentPLSQLRecType);
    descriptor.setStructureName(departmentRecType);
    
    descriptor.addFieldOrdering(departmentIdColumn);
    descriptor.addFieldOrdering(departmentNameColumn);
    descriptor.addFieldOrdering(departmentManagerColumn);
    descriptor.addFieldOrdering(departmentLocationColumn);
    
    descriptor.addDirectMapping(departmentIdEntity,
                                departmentIdColumn);
    descriptor.addDirectMapping(departmentNameEntity,
                                departmentNameColumn);
    descriptor.addDirectMapping(departmentManagerEntity, 
                                departmentManagerColumn);
    descriptor.addDirectMapping(departmentLocationEntity, 
                                departmentLocationColumn);
    
    descriptor.addPrimaryKeyFieldName(departmentIdColumn);
    return descriptor;
  }

}