package usda.weru.weps.location;

import java.text.DecimalFormat;
import java.text.Format;
import javax.measure.Measurable;
import javax.measure.quantity.Length;
import javax.measure.unit.NonSI;
import org.jscience.geography.coordinates.LatLong;
import usda.weru.gis.GISUtil;

/**
 *
 * @author Joseph Levin <joelevin@weru.ksu.edu>
 */
public class InterpolatedStation implements Station {

    private final LatLong c_latlong;

    /**
     *
     * @param latlong
     */
    public InterpolatedStation(LatLong latlong) {
        c_latlong = latlong;
    }

    @Override
    public String getDisplayName() {
        Format format = new DecimalFormat("#.00000");
        double lat = getLatLong().latitudeValue(NonSI.DEGREE_ANGLE);
        double lon = getLatLong().longitudeValue(NonSI.DEGREE_ANGLE);

        String latText = format.format(Math.abs(lat)) + "\u00B0 " + (lat > 0 ? "N" : "S");
        String lonText = format.format(Math.abs(lon)) + "\u00B0 " + (lon > 0 ? "E" : "W");

        return "Interpolated (" + latText + ", " + lonText + ")";
    }

    @Override
    public LatLong getLatLong() {
        return c_latlong;
    }

    /**
     *
     * @return
     */
    @Override
    public Measurable<Length> getElevation() {
        return null;
    }

    /**
     *
     * @param text
     * @return
     */
    public static InterpolatedStation deserialize(String text) {
        LatLong latlong = GISUtil.parse(text);
        return new InterpolatedStation(latlong);
    }

    /**
     *
     * @param station
     * @return
     */
    public static String serialize(InterpolatedStation station) {
        return GISUtil.format(station.getLatLong());
    }

    /**
     *
     * @param obj
     * @return
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final InterpolatedStation other = (InterpolatedStation) obj;
        if (this.c_latlong != other.c_latlong && (this.c_latlong == null || !this.c_latlong.equals(other.c_latlong))) {
            return false;
        }
        return true;
    }

    /**
     *
     * @return
     */
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 41 * hash + (this.c_latlong != null ? this.c_latlong.hashCode() : 0);
        return hash;
    }

}
