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

import java.nio.ByteBuffer;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import net.onrc.onos.core.datastore.DataStoreClient;
import net.onrc.onos.core.datastore.IKVTable.IKVEntry;
import net.onrc.onos.core.datastore.serializers.Device.DeviceProperty;
import net.onrc.onos.core.datastore.topology.KVLink.STATUS;
import net.onrc.onos.core.datastore.utils.ByteArrayComparator;
import net.onrc.onos.core.datastore.utils.ByteArrayUtil;
import net.onrc.onos.core.datastore.utils.KVObject;
import net.onrc.onos.core.topology.HostData;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.esotericsoftware.kryo.Kryo;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;

/**
 * Host object.
 * <p/>
 */
public class KVDevice extends KVObject {
    private static final Logger log = LoggerFactory.getLogger(KVDevice.class);

    private static final ThreadLocal<Kryo> DEVICE_KRYO = new ThreadLocal<Kryo>() {
        @Override
        protected Kryo initialValue() {
            Kryo kryo = new Kryo();
            kryo.setRegistrationRequired(true);
            kryo.setReferences(false);
            kryo.register(byte[].class);
            kryo.register(byte[][].class);
            kryo.register(HashMap.class);
            // TODO check if we should explicitly specify EnumSerializer
            kryo.register(STATUS.class);
            return kryo;
        }
    };

    static final String DEVICE_TABLE_SUFFIX = ":Host";

    private final byte[] mac;
    private TreeSet<byte[]> portIds;

    /**
     * Generate a HostID from MAC address.
     * <p/>
     * We're assuming MAC address can be an unique identifier for Host.
     *
     * @param mac MAC address
     * @return HostID
     */
    public static byte[] getHostID(final byte[] mac) {
        return HostData.getHostID(mac).array();
    }

    /**
     * Gets the MAC address from HostID.
     *
     * @param key HostID
     * @return MAC address
     */
    public static byte[] getMacFromKey(final byte[] key) {
        ByteBuffer keyBuf = ByteBuffer.wrap(key);
        if (keyBuf.getChar() != 'H') {
            throw new IllegalArgumentException("Invalid Host key");
        }
        byte[] mac = new byte[keyBuf.remaining()];
        keyBuf.get(mac);
        return mac;
    }

    /**
     * KVDevice constructor for default namespace.
     *
     * @param mac MAC address
     */
    public KVDevice(final byte[] mac) {
        this(mac, DEFAULT_NAMESPACE);
    }

    /**
     * KVDevice constructor for specified namespace.
     *
     * @param mac MAC address
     * @param namespace namespace to create this object
     */
    public KVDevice(final byte[] mac, final String namespace) {
        super(DataStoreClient.getClient()
                .getTable(namespace + DEVICE_TABLE_SUFFIX),
                getHostID(mac), namespace);

        this.mac = mac.clone();
        this.portIds = new TreeSet<>(ByteArrayComparator.BYTEARRAY_COMPARATOR);
    }

    /**
     * Gets an instance from HostID in default namespace.
     * <p/>
     * Note: You need to call `read()` to get the DB content.
     *
     * @param key HostID
     * @return KVDevice instance
     */
    public static KVDevice createFromKey(final byte[] key) {
        return createFromKey(key, DEFAULT_NAMESPACE);
    }

    /**
     * Gets an instance from HostID in specified namespace.
     * <p/>
     * Note: You need to call `read()` to get the DB content.
     *
     * @param key HostID
     * @param namespace namespace to create this object in
     * @return KVDevice instance
     */
    public static KVDevice createFromKey(final byte[] key, final String namespace) {
        return new KVDevice(getMacFromKey(key), namespace);
    }

    /**
     * Gets all the Devices in default namespace.
     *
     * @return Devices
     */
    public static Iterable<KVDevice> getAllDevices() {
        return new DeviceEnumerator(DEFAULT_NAMESPACE);
    }

    /**
     * Gets all the Devices in specified namespace.
     *
     * @param namespace namespace to iterate over
     * @return Devices
     */
    public static Iterable<KVDevice> getAllDevices(final String namespace) {
        return new DeviceEnumerator(namespace);
    }

    /**
     * Utility class to provide Iterable interface.
     */
    public static class DeviceEnumerator implements Iterable<KVDevice> {

        private final String namespace;

        /**
         * Constructor to iterate Links in specified namespace.
         *
         * @param namespace namespace to iterate through
         */
        public DeviceEnumerator(final String namespace) {
            this.namespace = namespace;
        }

        @Override
        public Iterator<KVDevice> iterator() {
            return new DeviceIterator(namespace);
        }
    }

    /**
     * Utility class to provide Iterator over all the Host objects.
     */
    public static class DeviceIterator extends AbstractObjectIterator<KVDevice> {

        /**
         * Constructor to create an iterator to iterate all the Devices
         * in specified namespace.
         *
         * @param namespace namespace to iterate through
         */
        public DeviceIterator(final String namespace) {
            super(DataStoreClient.getClient()
                    .getTable(namespace + DEVICE_TABLE_SUFFIX), namespace);
        }

        @Override
        public KVDevice next() {
            IKVEntry o = enumerator.next();
            KVDevice e = KVDevice.createFromKey(o.getKey(), namespace);
            e.deserialize(o.getValue(), o.getVersion());
            return e;
        }
    }

    /**
     * Gets the MAC address.
     *
     * @return MAC address
     */
    public byte[] getMac() {
        return mac.clone();
    }

    /**
     * Gets the HostID.
     *
     * @return HostID
     */
    public byte[] getId() {
        return getKey();
    }

    /**
     * Add a port to this Host's attachment points.
     *
     * @param portId PortID of the port which this Host is attached
     */
    public void addPortId(final byte[] portId) {
        portIds.add(portId.clone());
    }

    /**
     * Remove a port from this Host's attachment points.
     *
     * @param portId PortID to remove
     */
    public void removePortId(final byte[] portId) {
        portIds.remove(portId);
    }

    /**
     * Empty this Host's attachment points.
     */
    public void emptyPortIds() {
        portIds.clear();
    }

    /**
     * Add ports to this Host's attachment points.
     *
     * @param newPortIds PortIDs which this Host is attached
     */
    public void addAllToPortIds(final Collection<byte[]> newPortIds) {
        // TODO: Should we copy each portId, or reference is OK.
        portIds.addAll(newPortIds);
    }

    /**
     * Gets all the PortIDs which this Host is attached.
     *
     * @return Unmodifiable Set view of all the PortIds;
     */
    public Set<byte[]> getAllPortIds() {
        return Collections.unmodifiableSet(portIds);
    }

    @Override
    public byte[] serialize() {
        Map<Object, Object> map = getPropertyMap();

        DeviceProperty.Builder dev = DeviceProperty.newBuilder();

        dev.setMac(ByteString.copyFrom(mac));
        for (byte[] port : portIds) {
            dev.addPortIds(ByteString.copyFrom(port));
        }

        if (!map.isEmpty()) {
            byte[] propMaps = serializePropertyMap(DEVICE_KRYO.get(), map);
            dev.setValue(ByteString.copyFrom(propMaps));
        }

        return dev.build().toByteArray();
    }

    @Override
    protected boolean deserialize(final byte[] bytes) {

        try {
            boolean success = true;

            DeviceProperty dev = DeviceProperty.parseFrom(bytes);
            for (ByteString portId : dev.getPortIdsList()) {
                this.addPortId(portId.toByteArray());
            }
            byte[] props = dev.getValue().toByteArray();
            success &= deserializePropertyMap(DEVICE_KRYO.get(), props);
            return success;
        } catch (InvalidProtocolBufferException e) {
            log.error("Deserializing Host: " + this + " failed.", e);
            return false;
        }
    }

    @Override
    public String toString() {
        // TODO output all properties?
        return "[" + this.getClass().getSimpleName()
                + " " + ByteArrayUtil.toHexStringBuilder(mac, ":") + "]";
    }
}
