/*
 * SoilListBuilder.java
 *
 * Created on October 18, 2007, 11:50 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package usda.weru.util.diff.listbuilders;

import usda.weru.soil.IFC;
import usda.weru.util.diff.DiffEngine;
import usda.weru.util.diff.DiffNode;
import usda.weru.util.diff.IncomparableObjectsException;

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

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

    private DiffNode buildList(DiffEngine engine, IFC a, IFC b) throws IncomparableObjectsException {
        DiffNode node = new DiffNode("IFC File", a, b);

        if (a != null) {
            node.setA(a.getFileName());
        }
        if (b != null) {
            node.setB(b.getFileName());
        }

        if (a == null || b == null) {
            return node;
        }

        //Soil detail
        node.addChild("State", a.state, b.state);
        node.addChild("County", a.county, b.county);
        node.addChild("Survey Area", a.soilSurveyAreaName, b.soilSurveyAreaName);
        node.addChild("Survey ID", a.soilSurveyID, b.soilSurveyID);
        node.addChild("Map Unit", a.mapUnitSymbol, b.mapUnitSymbol);
        node.addChild("Component", a.componentName, b.componentName);
        node.addChild("Component %", a.componentPercent, b.componentPercent);
        node.addChild("Soil Order", a.taxOrder, b.taxOrder);
        node.addChild("Local Phase", a.localPhase, b.localPhase);
        node.addChild("Texture", a.surfaceTexture, b.surfaceTexture);
        node.addChild("Loss Tolerance", a.soilLossTolerance, b.soilLossTolerance);

        //Surface detail           
        DiffNode surface = new DiffNode("Surface", null, null);
        node.addChild(surface);
        surface.addChild("Thickness", a.crustThickness, b.crustThickness);
        surface.addChild("Density", a.crustDensity, b.crustDensity);
        surface.addChild("Stability", a.crustStability, b.crustStability);
        surface.addChild("Fraction", a.crustFraction, b.crustFraction);
        surface.addChild("Loose Material Mass", a.crustLooseMaterialMass, b.crustLooseMaterialMass);
        surface.addChild("Loose Material Cover Fraction", a.crustLooseMaterialFraction, b.crustLooseMaterialFraction);
        surface.addChild("Random Roughness", a.randomRoughness, b.randomRoughness);
        surface.addChild("Ridge Orientation", a.roughnessOrientation, b.roughnessOrientation);
        surface.addChild("Ridge Height", a.roughnessHeight, b.roughnessHeight);
        surface.addChild("Ridge Spacing", a.roughnessSpacing, b.roughnessSpacing);
        surface.addChild("Ridge Width", a.roughnessWidth, b.roughnessWidth);
        surface.addChild("Soil Albedo Dry", a.surfaceAlbedo, b.surfaceAlbedo);
        surface.addChild("Slope", a.surfaceSlope, b.surfaceSlope);
        surface.addChild("Fragments", a.surfaceFragmentCover, b.surfaceFragmentCover);
        surface.addChild("Bedrock Depth", a.bedrockDepth, b.bedrockDepth);
        surface.addChild("Restriction Depth", a.impermiableDepth, b.impermiableDepth);

        //Layers
        int layerCount = Math.max(a.nsl, b.nsl);
        for (int i = 0; i < layerCount; i++) {
            DiffNode layer = new DiffNode("Layer " + (i + 1), null, null);
            if (i < a.nsl) {
                layer.setA(" ");
            }
            if (i < b.nsl) {
                layer.setB(" ");
            }
            if (layer.getA() == null || layer.getB() == null) {
                node.addChild(layer);
                continue;
            }
            layer.addChild("Thickness", a.layerThickness[i], b.layerThickness[i]);
            layer.addChild("Organic Matter", a.organicMaterial[i], b.organicMaterial[i]);

            layer.addChild("Sand", a.fractionSand[i], b.fractionSand[i]);
            layer.addChild("Silt", a.fractionSilt[i], b.fractionSilt[i]);
            layer.addChild("Clay", a.fractionClay[i], b.fractionClay[i]);
            layer.addChild("Rock", a.fractionRock[i], b.fractionRock[i]);

            layer.addChild("Very Coarse", a.veryCoarseSandFraction[i], b.veryCoarseSandFraction[i]);
            layer.addChild("Coarse", a.veryCoarseSandFraction[i], b.veryCoarseSandFraction[i]);
            layer.addChild("Medium", a.mediumSandFraction[i], b.mediumSandFraction[i]);
            layer.addChild("Fine", a.fineSandFraction[i], b.fineSandFraction[i]);
            layer.addChild("Very Fint", a.veryFineSandFraction[i], b.veryFineSandFraction[i]);

            layer.addChild("Wet Bulk Density", a.wetBulkDensity[i], b.wetBulkDensity[i]);
            layer.addChild("Initial Bulk Density", a.initialBulkDensity[i], b.initialBulkDensity[i]);

            layer.addChild("Aggregate GMD", a.aggregateMeanDiameter[i], b.aggregateMeanDiameter[i]);
            layer.addChild("Aggregate GSD", a.aggregateStdDeviation[i], b.aggregateStdDeviation[i]);
            layer.addChild("Aggregate Max Size", a.maxAggregateSize[i], b.maxAggregateSize[i]);
            layer.addChild("Aggregate Min Size", a.minAggregateSize[i], b.minAggregateSize[i]);
            layer.addChild("Aggregate Density", a.aggregateDensity[i], b.aggregateDensity[i]);
            layer.addChild("Aggregate Stability", a.aggregateStability[i], b.aggregateStability[i]);

            layer.addChild("Water Content Initial", a.initialSWC[i], b.initialSWC[i]);
            layer.addChild("Water Content Saturation", a.saturatedSWC[i], b.saturatedSWC[i]);
            layer.addChild("Water Content Field Capacity", a.fieldCapacitySWC[i], b.fieldCapacitySWC[i]);
            layer.addChild("Water Content Wilting Point", a.wiltingPointSWC[i], b.wiltingPointSWC[i]);

            layer.addChild("CB", a.soilCB[i], b.soilCB[i]);
            layer.addChild("Air Entry Potential", a.airEntryPotential[i], b.airEntryPotential[i]);
            layer.addChild("Sat. Hydraulic Conductivity", a.saturatedHydraulicConductivity[i], b.saturatedHydraulicConductivity[i]);
            layer.addChild("pH", a.soilpH[i], b.soilpH[i]);
            layer.addChild("CaCO3", a.calciumCarbonateEquivalent[i], b.calciumCarbonateEquivalent[i]);
            layer.addChild("CEC", a.cationExchangeCapacity[i], b.cationExchangeCapacity[i]);
            layer.addChild("Linerar Extensibility %", a.linearExtensibility[i], b.linearExtensibility[i]);

            node.addChild(layer);
        }

        return node;
    }
}
