package skadistats.clarity.analyzer.replay;

import javafx.beans.binding.ObjectBinding;
import javafx.beans.binding.StringBinding;
import skadistats.clarity.model.Entity;
import skadistats.clarity.model.FieldPath;

public class ObservableEntityProperty {

    private final StringBinding index;
    private final StringBinding name;
    private final StringBinding value;
    private final ObjectBinding raw;
    private boolean dirty = false;
    private long lastChangedAt;

    public ObservableEntityProperty(Entity entity, FieldPath fieldPath) {
        index = new StringBinding() {
            @Override
            protected String computeValue() {
                return fieldPath.toString();
            }
        };
        name = new StringBinding() {
            @Override
            protected String computeValue() {
                return entity.getDtClass().getNameForFieldPath(fieldPath);
            }
        };
        value = new StringBinding() {
            @Override
            protected String computeValue() {
                Object value = entity.getPropertyForFieldPath(fieldPath);
                return value != null ? value.toString() : "-";
            }
        };
        raw = new ObjectBinding() {
            @Override
            protected Object computeValue() {
                return entity.getPropertyForFieldPath(fieldPath);
            }
        };
    }

    public String getIndex() {
        return index.get();
    }

    public StringBinding indexProperty() {
        return index;
    }

    public String getName() {
        return name.get();
    }

    public StringBinding nameProperty() {
        return name;
    }

    public String getValue() {
        return value.get();
    }

    public StringBinding valueProperty() {
        return value;
    }

    public Object getRaw() {
        return raw.get();
    }

    public <T> ObjectBinding<T> rawProperty() {
        return raw;
    }

    public long getLastChangedAt() {
        return lastChangedAt;
    }

    public boolean isDirty() {
        return dirty;
    }

    public void setDirty(boolean dirty) {
        this.dirty = dirty;
        if (dirty) {
            lastChangedAt = System.currentTimeMillis();
        }
    }
}