/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.autoplot.dom;

import java.lang.reflect.InvocationTargetException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author jbf
 */
public class PropertyChangeDiff implements Diff {

    private static final Logger logger= org.das2.util.LoggerManager.getLogger("autoplot.dom");

    String propertyName;
    Object oldVal;
    Object newVal;

    PropertyChangeDiff(String propertyName, Object oldVal, Object newVal) {
        this.propertyName = propertyName;
        this.oldVal = oldVal;
        this.newVal = newVal;
    }

    private static void doSet(DomNode node, String propertyName, Object oldVal1, Object newVal) {
        try {
            //Object oldVal =  DomUtil.getPropertyValue(node, propertyName);
            //if (!(oldVal == oldVal1 || oldVal.equals(oldVal1))) {
                //throw new IllegalArgumentException("old value");
                //let's be loosey goosey on this because sometimes setting one property resets another
            //}
            DomUtil.setPropertyValue( node, propertyName, newVal );
        } catch (IllegalAccessException ex) {
            logger.log(Level.SEVERE, ex.getMessage(), ex);
        } catch (IllegalArgumentException ex) {
            logger.log(Level.SEVERE, ex.getMessage(), ex);
        } catch (InvocationTargetException ex) {
            logger.log(Level.SEVERE, ex.getMessage(), ex);
        }
    }

    public void doDiff(DomNode node) {
        doSet(node, propertyName, oldVal, newVal);
    }

    public void undoDiff(DomNode node) {
        doSet(node, propertyName, newVal, oldVal);
    }

    public String propertyName() {
        return propertyName;
    }

    @Override
    public String toString() {
        String s = this.propertyName + " " + oldVal + " to " + newVal;
        if (s.length() > 30) {
            if ( newVal instanceof Boolean ) {
                s = this.propertyName + "=" + newVal;
            } else {
                s = this.propertyName;
            }
        }
        return s;
    }

    public String getLabel() {
        return toString();
    }

    public String getDescription() {
        return this.propertyName + " " + oldVal + " \u2192 " + newVal;
    }
}