/*
 * RowInfoMatcher.java
 *
 * Created on May 25, 2006, 12:52 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package usda.weru.util.diff.listbuilders;

import usda.weru.mcrew.MCREWConfig;
import usda.weru.mcrew.CropMeta;
import usda.weru.mcrew.CropObject;
import usda.weru.util.diff.*;

/**
 *
 * @author Joseph Levin
 */
public class CropObjectListBuilder extends ObjectListBuilder {

    /**
     *
     * @param engine
     * @param a
     * @param b
     * @return
     * @throws IncomparableObjectsException
     */
    @Override
    public DiffNode buildList(DiffEngine engine, Object a, Object b) throws IncomparableObjectsException {
        test(CropObject.class, a, b);
        return applyExtras(buildList(engine, (CropObject) a, (CropObject) b));
    }

    /**
     *
     * @param engine
     * @param cropA
     * @param cropB
     * @return
     */
    public DiffNode buildList(DiffEngine engine, CropObject cropA, CropObject cropB) {
        DiffNode node = new DiffNode("Crop Object", cropA, cropB);

        if (cropA != null) {
            node.setA(cropA.getCropName());
        }
        if (cropB != null) {
            node.setB(cropB.getCropName());
        }

        if (cropA == null || cropB == null) {
            return node;
        }

        CropMeta meta = (CropMeta) MCREWConfig.getObjectMeta("crop");
        String valueA;
        String valueB;
        for (String parameter : meta.getParameterNames()) {
            valueA = null;
            valueB = null;

            if (cropA != null) {
                valueA = cropA.getValue(parameter);
            }
            if (cropB != null) {
                valueB = cropB.getValue(parameter);
            }

            try {
                double dA = Double.parseDouble(valueA);
                double dB = Double.parseDouble(valueB);
                node.addChild(parameter, dA, dB);
            } catch (Exception e) {
                //Values are not numeric
                node.addChild(parameter, valueA, valueB);
            }

        }

        return node;
    }

}
