/*
 *    GeoTools - OpenSource mapping toolkit
 *    http://geotools.org
 *    (C) 2005-2006, GeoTools Project Managment Committee (PMC)
 *    
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU Lesser General Public
 *    License as published by the Free Software Foundation;
 *    version 2.1 of the License.
 *
 *    This library is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *    Lesser General Public License for more details.
 */
package org.geotools.feature.visitor;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;


/**
 * An abstract implementation for CalcResults. Each subclass should implement
 * its own getValue(), merge(), and constructor methods.
 * 
 * @author Cory Horner, Refractions
 * 
 * @since 2.2.M2
 * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/library/main/src/main/java/org/geotools/feature/visitor/AbstractCalcResult.java $
 */
public class AbstractCalcResult implements CalcResult {
    public boolean isCompatible(CalcResult targetResults) {
        return false;
    }

    public CalcResult merge(CalcResult resultsToAdd) {
        return null;
    }

    public Object getValue() {
        return null;
    }

    public int toInt() {
        Object value = getValue();
        if (value instanceof Number) {
        	Number number = (Number) value;
        	return number.intValue();
        } else {
        	return (int) 0;
        }
    }

    public double toDouble() {
        Object value = getValue();
        if (value instanceof Number) {
        	Number number = (Number) value;
        	return number.doubleValue();
        } else {
        	return (double) 0;
        }
    }

    public long toLong() {
        Object value = getValue();
        if (value instanceof Number) {
        	Number number = (Number) value;
        	return number.longValue();
        } else {
        	return (long) 0;
        }
    }

    public float toFloat() {
        Object value = getValue();
        if (value instanceof Number) {
        	Number number = (Number) value;
        	return number.floatValue();
        } else {
        	return (float) 0;
        }
    }

    public Geometry toGeometry() {
    	Object value = getValue();
    	if (value instanceof Geometry)
    		return (Geometry) getValue();
    	else
    		return null;
    }

    public Envelope toEnvelope() {
    	Object value = getValue();
    	if (value instanceof Envelope)
    		return (Envelope) value;
    	else
    		return null;
    }
    
    public Point toPoint() {
        Geometry geometry = toGeometry();
        return geometry.getCentroid();
    }

    public Set toSet() {
        Object value = getValue();

        if (value == null) {
            return null;
        }

        if (value instanceof Set) {
            Set set = (Set) value;

            return set;
        }

        if (value.getClass().isArray()) {
            Set set = new HashSet(Arrays.asList((Object[]) value));

            return set;
        }

        if (value instanceof Collection) {
            Set set = new HashSet((Collection) value);

            return set;
        }

        return null;
    }

    public List toList() {
		Object value = getValue();

		if (value == null) {
			return null;
		}

		if (value instanceof List) {
			List list = (List) value;

			return list;
		}

		if (value.getClass().isArray()) {
			return Arrays.asList((Object[]) value);
		}

		if (value instanceof HashSet) {
			Set set = (HashSet) value;
			// Object[] values = set.toArray();
			return Arrays.asList(set.toArray());
			// List list = new ArrayList();
			// for (int i = 0; i < values.length; i++)
			// list.add(values[i]);
			// return list;
		}

		if (value instanceof Collection) {
			return new ArrayList((Collection) value);
		}

		return null;
	}

    public Object[] toArray() {
        List list = toList();

        if (list == null) {
            return null;
        }

        return list.toArray();
    }

    public String[] toStringArray() {
        List list = toList();

        if (list == null) {
            return null;
        }

        String[] strings = new String[list.size()];

        return (String[]) list.toArray(strings);
    }

    public Map toMap() {
        return (Map) getValue();
    }

    public String toString() {
        return getValue().toString();
    }
}
