package net.onrc.onos.core.datastore.ramcloud;

import net.onrc.onos.core.datastore.IKVTableID;
import net.onrc.onos.core.datastore.IMultiEntryOperation;
import net.onrc.onos.core.datastore.internal.IModifiableMultiEntryOperation;
import net.onrc.onos.core.datastore.ramcloud.RCTable.Entry;

// FIXME move or extract this
public class RCMultiEntryOperation implements IMultiEntryOperation, IModifiableMultiEntryOperation {
    protected final RCTableID tableId;
    protected final Entry entry;
    protected final OPERATION operation;
    protected STATUS status;

    @Override
    public boolean hasSucceeded() {
        return this.status == STATUS.SUCCESS;
    }

    @Override
    public STATUS getStatus() {
        return status;
    }

    @Override
    public IKVTableID getTableId() {
        return tableId;
    }

    @Override
    public byte[] getKey() {
        return entry.key;
    }

    @Override
    public byte[] getValue() {
        return entry.value;
    }

    @Override
    public long getVersion() {
        return entry.version;
    }

    @Override
    public OPERATION getOperation() {
        return operation;
    }

    @Override
    public void setStatus(final STATUS status) {
        this.status = status;
    }

    @Override
    public void setValue(byte[] value, final long version) {
        this.entry.setValue(value);
        setVersion(version);
    }

    @Override
    public void setVersion(final long version) {
        this.entry.setVersion(version);
    }


    public RCMultiEntryOperation(final IKVTableID tableId, final Entry entry, final OPERATION operation) {
        this.tableId = (RCTableID) tableId;
        this.operation = operation;

        this.entry = entry;
        this.status = STATUS.NOT_EXECUTED;
    }

    public static IMultiEntryOperation create(final IKVTableID tableId, final byte[] key, final byte[] value) {
        return new RCMultiEntryOperation(tableId, new Entry(key, value, RCClient.VERSION_NONEXISTENT), OPERATION.CREATE);
    }

    public static IMultiEntryOperation forceCreate(final IKVTableID tableId, final byte[] key, final byte[] value) {
        return new RCMultiEntryOperation(tableId, new Entry(key, value, RCClient.VERSION_NONEXISTENT), OPERATION.FORCE_CREATE);
    }

    /**
     * Constructor for READ operation.
     *
     * @param tableId table to read from
     * @param key     key of an Entry to read
     */
    public static IMultiEntryOperation read(final IKVTableID tableId, final byte[] key) {
        return new RCMultiEntryOperation(tableId, new Entry(key), OPERATION.READ);
    }

    public static IMultiEntryOperation update(final IKVTableID tableId, final byte[] key, final byte[] value, final long version) {
        return new RCMultiEntryOperation(tableId, new Entry(key, value, version), OPERATION.UPDATE);
    }

    public static IMultiEntryOperation delete(final IKVTableID tableId, final byte[] key, final byte[] value, final long version) {
        return new RCMultiEntryOperation(tableId, new Entry(key, value, version), OPERATION.DELETE);
    }

    public static IMultiEntryOperation forceDelete(final IKVTableID tableId, final byte[] key) {
        return new RCMultiEntryOperation(tableId, new Entry(key), OPERATION.FORCE_DELETE);
    }

    @Override
    public IModifiableMultiEntryOperation getActualOperation() {
        return this;
    }

    @Override
    public String toString() {
        return "[RCMultiEntryOperation tableId=" + tableId + ", entry=" + entry
                + ", operation=" + operation + ", status=" + status + "]";
    }
}
