package mhtree;

import cz.muni.fi.disa.similarityoperators.cover.AbstractRepresentation.PrecomputedDistances;
import messif.buckets.BucketStorageException;
import messif.buckets.LocalBucket;
import messif.objects.LocalAbstractObject;
import messif.objects.util.AbstractObjectIterator;

import java.io.Serializable;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class LeafNode extends Node implements Serializable {

    /**
     * Serialization ID
     */
    private static final long serialVersionUID = 1L;
    private LocalBucket bucket;

    LeafNode(PrecomputedDistances distances, LocalBucket bucket, InsertType insertType, ObjectToNodeDistance objectToNodeDistance) throws BucketStorageException {
        super(distances, insertType, objectToNodeDistance);

        this.bucket = bucket;
        this.bucket.addObjects(distances.getObjects());
    }

    public void addObject(LocalAbstractObject object) throws BucketStorageException {
        bucket.addObject(object);

        addNewObject(object);
    }

    public Set<LocalAbstractObject> getObjects() {
        Set<LocalAbstractObject> objects = new HashSet<>(bucket.getObjectCount());

        for (AbstractObjectIterator<LocalAbstractObject> it = bucket.getAllObjects(); it.hasNext(); )
            objects.add(it.next());

        return objects;
    }

    public int getHeight() {
        return 0;
    }

    public List<Node> getNodesOnLevel(int level) {
        return Collections.singletonList(this);
    }
}