package usda.weru.gis.data;

import org.geotools.data.FeatureSource;
import usda.weru.gis.latlong.LatLong;
import org.opengis.feature.Feature;
import usda.weru.weps.location.CligenStation;

import tec.uom.se.quantity.Quantities;
import systems.uom.common.USCustomary;
import javax.measure.quantity.Length;
import si.uom.SI;
import javax.measure.Quantity;

/**
 *
 * @author Joseph Levin <joelevin@weru.ksu.edu>
 */
public class CligenSelectAreaLookup extends AbstractLookup<CligenSelectArea> {

    private static final String COLUMN_NAME = "NAME";
    private static final String COLUMN_C1 = "C1";
    private static final String COLUMN_C2 = "C2";
    private static final String COLUMN_ST_FIPS = "ST_FIPS";
    private static final String COLUMN_LAT = "LAT_DD";
    private static final String COLUMN_LONG = "LONG_DD";
    private static final String COLUMN_ELEV_M = "ELEV_M";

    /**
     *
     * @param source
     * @param feature
     * @return
     */
    @Override
    protected CligenSelectArea create(FeatureSource<?, ?> source, Feature feature) {
        String name = getValue(feature, COLUMN_NAME, String.class);
        name = name != null ? name.trim() : null;
        if ("out".equals(name.toLowerCase())) {
            return new CligenSelectArea(SelectArea.Type.Out);
        } else {
            Integer state = getValue(feature, COLUMN_ST_FIPS, Integer.class);
            Integer id = getValue(feature, COLUMN_C1, Integer.class);
            Double lat = getValue(feature, COLUMN_LAT, Double.class);
            Double lon = getValue(feature, COLUMN_LONG, Double.class);
            LatLong latlong = LatLong.valueOf(lat, lon, USCustomary.DEGREE_ANGLE);//.DEGREE_ANGLE);

            double elevationMeters = getValue(feature, COLUMN_ELEV_M, Integer.class).doubleValue();

            Quantity<Length> elevation = Quantities.getQuantity(elevationMeters, SI.METRE);

            CligenStation station = new CligenStation(latlong, elevation, name, state, id);
            return new CligenSelectArea(station);
        }
    }

    /**
     *
     * @return
     */
    @Override
    protected Class<CligenSelectArea> getSupportedClass() {
        return CligenSelectArea.class;
    }

    @Override
    protected boolean supports(FeatureSource<?, ?> source) {

        return hasColumn(source, COLUMN_C1, Integer.class) && hasColumn(source, COLUMN_C2, Integer.class);
    }

}
