package usda.weru.weps;

import java.util.Date;
import javax.measure.Measurable;
import javax.measure.Measure;
import javax.measure.quantity.Duration;
import javax.measure.quantity.Length;
import javax.measure.unit.NonSI;
import javax.measure.unit.SI;

import javolution.text.Text;
import org.apache.log4j.Logger;
import org.jscience.geography.coordinates.LatLong;
import usda.weru.gis.GISUtil;
import usda.weru.weps.location.ElevationMode;
import usda.weru.weps.location.Site;
import usda.weru.weps.location.Station;
import usda.weru.weps.location.StationMode;
import usda.weru.weps.location.StationUtil;

/**
 *
 * @author Joseph Levin <joelevin@weru.ksu.edu>
 */
public class RunFileBeanStringPersistence implements RunFileBeanPersistenceHandler<String> {

    private static final Logger LOGGER = Logger.getLogger(RunFileBeanStringPersistence.class);

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeElevationMode(ElevationMode value) {
        return value.getName();
    }

    /**
     *
     * @param text
     * @return
     */
    @Override
    public ElevationMode deserializeElevationMode(String text) {
        return ElevationMode.parse(text);
    }

    /**
     *
     * @param text
     * @return
     */
    @Override
    public Measurable<Length> deserializeElevation(String text) {
        try {
            double value = Double.valueOf(text);
            return Measure.valueOf(value, SI.METER);
        } catch (NumberFormatException nfe) {
            LOGGER.error("Error parsing elevation value: " + text, nfe);
            return null;
        }
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeElevation(Measurable<Length> value) {
        return String.valueOf(value.doubleValue(SI.METER));
    }
    //END ELEVATION

    //CLIGEN
    /**
     *
     * @param text
     * @return
     */
    @Override
    public StationMode deserializeCligenStationMode(String text) {
        return StationMode.parse(text);
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeCligenStationMode(StationMode value) {
        return value.getName();
    }

    /**
     *
     * @param text
     * @return
     */
    @Override
    public Station deserializeCligenStation(String text) {
        return StationUtil.deserializeStation(text);
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeCligenStation(Station value) {
        return StationUtil.serializeStation(value);
    }
    //END CLIGEN

    //WINDGEN
    /**
     *
     * @param text
     * @return
     */
    @Override
    public StationMode deserializeWindgenStationMode(String text) {
        return StationMode.parse(text);
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeWindgenStationMode(StationMode value) {
        return value.getName();
    }

    /**
     *
     * @param text
     * @return
     */
    @Override
    public Station deserializeWindgenStation(String text) {
        return StationUtil.deserializeStation(text);
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeWindgenStation(Station value) {
        return StationUtil.serializeStation(value);
    }
    //END WINDGEN

    //LATLONG
    /**
     *
     * @param text
     * @return
     */
    @Override
    public LatLong deserializeLatLong(String text) {
        return GISUtil.parse(text);
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeLatLong(LatLong value) {
        return GISUtil.format(value);
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public Text deserializeNotes(String value) {
        return value != null ? Text.valueOf(value) : null;
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeNotes(Text value) {
        return value != null ? value.toString() : null;
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public Site<?> deserializeSite(String value) {
        return Site.valueOf(value);
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeSite(Site<?> value) {
        return value.toString();
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeCycleCount(Integer value) {
        return value != null ? String.valueOf(value) : null;
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public Integer deserializeCycleCount(String value) {
        if (value == null) {
            return null;
        }
        value = value.trim();
        return Integer.valueOf(value);
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String deserializeClientName(String value) {
        return value;
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeClientName(String value) {
        return value;
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String deserializeClientFarm(String value) {
        return value;
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeClientFarm(String value) {
        return value;
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String deserializeClientTract(String value) {
        return value;
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeClientTract(String value) {
        return value;
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String deserializeClientField(String value) {
        return value;
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeClientField(String value) {
        return value;
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public RunMode deserializeRunMode(String value) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeRunMode(RunMode value) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public Measurable<Duration> deserializeRotationLength(String value) {
        value = value != null ? value.trim() : null;
        if (value == null || value.length() == 0) {
            return null;
        }

        long len = Long.valueOf(value);
        return Measure.valueOf(len, NonSI.YEAR);
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeRotationLength(Measurable<Duration> value) {
        return value != null ? String.valueOf(value.longValue(NonSI.YEAR)) : null;
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public Date deserializeSimulationStartDate(String value) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeSimulationStartDate(Date value) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public Date deserializeSimulationEndDate(String value) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeSimulationEndDate(Date value) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public Integer deserializeTimeSteps(String value) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     *
     * @param value
     * @return
     */
    @Override
    public String serializeTimeSteps(Integer value) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
