/*! ******************************************************************************
 *
 * Pentaho Data Integration
 *
 * Copyright (C) 2002-2017 by Hitachi Vantara : http://www.pentaho.com
 *
 *******************************************************************************
 *
 * 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.pentaho.gis.shapefiles;

import org.pentaho.di.core.row.RowMetaInterface;


/**
 * Base class for the ESRI shapes
 *
 * @author Matt
 * @since 30-jun-2004
 *
 */
public class Shape {
  public static final int SHAPE_TYPE_NULL         =  0;    // : retval = "Null Shape"; break;
  public static final int SHAPE_TYPE_POINT        =  1;    // : retval = "Point"; break;
  public static final int SHAPE_TYPE_POLYLINE     =  3;    // : retval = "PolyLine"; break;
  public static final int SHAPE_TYPE_POLYGON      =  5;    // : retval = "Polygon"; break;
  public static final int SHAPE_TYPE_MULTIPOINT   =  8;    // : retval = "MultiPoint"; break;
  public static final int SHAPE_TYPE_POINTZ       = 11;    // : retval = "PointZ"; break;
  public static final int SHAPE_TYPE_POLYLINE_Z   = 13;    // : retval = "PolyLineZ"; break;
  public static final int SHAPE_TYPE_POLYGON_Z    = 15;    // : retval = "PolygonZ"; break;
  public static final int SHAPE_TYPE_MULTIPOINT_Z = 18;    // : retval = "MultiPointZ"; break;
  public static final int SHAPE_TYPE_POINT_M      = 21;    // : retval = "PointM"; break;
  public static final int SHAPE_TYPE_POLYLINE_M   = 23;    // : retval = "PolyLineM"; break;
  public static final int SHAPE_TYPE_POLYGON_M    = 25;    // : retval = "PolygonM"; break;
  public static final int SHAPE_TYPE_MULTIPOINT_M = 28;    // : retval = "MultiPointM"; break;
  public static final int SHAPE_TYPE_MULTIPATCH   = 31;    // : retval = "MultiPatch"; break;

  private Object[] dbfData;
  private RowMetaInterface dbfMeta;

  public static final String getEsriTypeDesc( int type ) {
    String retval = "Unknown";

    switch ( type ) {
      case SHAPE_TYPE_NULL:
        retval = "Null Shape";
        break;
      case SHAPE_TYPE_POINT:
        retval = "Point";
        break;
      case SHAPE_TYPE_POLYLINE:
        retval = "PolyLine";
        break;
      case SHAPE_TYPE_POLYGON:
        retval = "Polygon";
        break;
      case SHAPE_TYPE_MULTIPOINT:
        retval = "MultiPoint";
        break;
      case SHAPE_TYPE_POINTZ:
        retval = "PointZ";
        break;
      case SHAPE_TYPE_POLYLINE_Z:
        retval = "PolyLineZ";
        break;
      case SHAPE_TYPE_POLYGON_Z:
        retval = "PolygonZ";
        break;
      case SHAPE_TYPE_MULTIPOINT_Z:
        retval = "MultiPointZ";
        break;
      case SHAPE_TYPE_POINT_M:
        retval = "PointM";
        break;
      case SHAPE_TYPE_POLYLINE_M:
        retval = "PolyLineM";
        break;
      case SHAPE_TYPE_POLYGON_M:
        retval = "PolygonM";
        break;
      case SHAPE_TYPE_MULTIPOINT_M:
        retval = "MultiPointM";
        break;
      case SHAPE_TYPE_MULTIPATCH:
        retval = "MultiPatch";
        break;
      default:
        break;
    }

    return retval;
  }

  protected int type;

  public Shape( int type ) {
    setType( type );
    dbfData = null;
  }


  public int getType() {
    return type;
  }

  public String getTypeDesc() {
    return getEsriTypeDesc( type );
  }

  public void setType( int type ) {
    this.type = type;
  }

  /**
   * @return Returns the dbfData.
   */
  public Object[] getDbfData() {
    return dbfData;
  }

  /**
   * @param dbfData The dbfData to set.
   */
  public void setDbfData( Object[] dbfData ) {
    this.dbfData = dbfData;
  }

  public RowMetaInterface getDbfMeta() {
    return dbfMeta;
  }

  public void setDbfMeta( RowMetaInterface dbfMeta ) {
    this.dbfMeta = dbfMeta;
  }
}
