/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package usda.weru.gis.data;

import javax.measure.Measurable;
import javax.measure.Measure;
import javax.measure.quantity.Length;
import javax.measure.unit.NonSI;
import javax.measure.unit.SI;
import org.geotools.data.FeatureSource;
import org.jscience.geography.coordinates.LatLong;
import org.opengis.feature.Feature;
import usda.weru.weps.location.CligenStation;

/**
 *
 * @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";
    
    @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, NonSI.DEGREE_ANGLE);

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

            Measurable<Length> elevation = Measure.valueOf(elevationMeters, SI.METER);
                   
            CligenStation station = new CligenStation(latlong,elevation, name, state, id);
            return new CligenSelectArea(station);
        }        
    }

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

    @Override
    protected boolean supports(FeatureSource source) {
        if(hasColumn(source, COLUMN_C1, Integer.class) && hasColumn(source, COLUMN_C2, Integer.class)){
            return true;
        }

        return false;
    }

}
