/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package usda.weru.util;

import java.awt.Component;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.measure.Measure;
import javax.measure.unit.Unit;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import org.apache.log4j.Logger;
import usda.weru.util.ConfigData.MeasureableConfigurationOption;
import usda.weru.weps.fuel.Fuel;
import usda.weru.weps.fuel.FuelChooser;
import usda.weru.weps.fuel.FuelDAO;
import usda.weru.weps.location.chooser.AllowedStationModeChooser;

/**
 *
 * @author wjr
 */
public class LoadProperties {
    private static final Logger LOGGER = Logger.getLogger(LoadProperties.class);

    private Map<String, List<Component>> HT_comp = new HashMap<String, List<Component>>();

    public void addToTable(String key, Component comp) {
        if (HT_comp.containsKey(key)) {
            List<Component> compVec = HT_comp.get(key);
            compVec.add(comp);
        } else {
            Vector<Component> vec = new Vector<Component>();
            vec.add(comp);
            HT_comp.put(key, vec);
        }
    }

    public void getChildren(JComponent con) {
        Component[] children = con.getComponents();
        for (Component child : children) {
            String name = child.getName();
            if (!"".equals(name) && name != null) {
                if (name.contains(":")) {
                    name = name.substring(0, name.indexOf(":"));

                }
                LOGGER.debug("Found: " + name + " on " + child.toString());
                addToTable(name, child);
            }
            if (child instanceof JComponent) {
                LOGGER.debug("Descending into: " + child.toString());
                getChildren((JComponent) child);
            }
        }
    }

    public void setupPropertyHashtable(JComponent comp) {
        getChildren(comp);
    }

    public void loadData(String property, String value) {
        List<Component> vec = HT_comp.get(property);
        if (vec == null) {      // property not found on this form
            return;
        }
        for (Component comp : vec) {
            if(comp instanceof MeasurableField){
               MeasurableField mf = (MeasurableField) comp;
               MeasureableConfigurationOption option = ConfigData.getDefault().getMeasureableConfigurationOption(mf.getName());
               Unit units = ConfigData.getDefault().getMeasureableUnit(mf.getName());

               if(units != null){

                   Measure measurableValue;
                   if(option.isDouble()){
                       measurableValue = Measure.valueOf(Double.valueOf(value), units);
                   }
                   else{
                       measurableValue = Measure.valueOf(Long.valueOf(value), units);
                   }

                   if(mf.getUnits() == null){
                       mf.setUnits(measurableValue.getUnit());
                   }
                   mf.setValue(measurableValue);
               }
               else{
                   LOGGER.warn("MeasureableConfigurationOption is not set for " + mf.getName());
               }

           }
            else if (comp instanceof JTextField) {
                ((JTextField) comp).setText(value);
                break;
            } else if (comp instanceof JCheckBox) {
                ((JCheckBox) comp).setSelected("1".equals(value.trim()));
            } else if (comp instanceof JRadioButton) {
                JRadioButton jrb = (JRadioButton) comp;
                if (jrb.getName().trim().endsWith(value)) {
                    jrb.setSelected(true);
                }
            }
            else if(comp instanceof AllowedStationModeChooser){
                AllowedStationModeChooser chooser = (AllowedStationModeChooser) comp;
                chooser.deserializeSelectedModes(value);
            }
            else if(comp instanceof FuelChooser){
                FuelChooser chooser = (FuelChooser) comp;
                Fuel fuel = FuelDAO.getInstance().getFuel(value);
                chooser.setSelectedFuel(fuel);
            }
        }
    }

    public Collection<Component> getComponentsForProperty(String propertyName){
        return HT_comp.get(propertyName);
    }
}
