package mizo.iterators;

import com.google.common.collect.Iterators;
import com.google.common.collect.PeekingIterator;
import mizo.core.IMizoRDDConfig;
import mizo.core.IMizoRelationParser;
import mizo.core.MizoEdge;
import mizo.core.MizoVertex;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Iterator;

/**
 * Created by imrihecht on 12/10/16.
 */
public class MizoVerticesIterator extends  MizoBaseRelationsIterator<MizoVertex> {
    private static final Logger log = LoggerFactory.getLogger(MizoVerticesIterator.class);

    /**
     * Each call to this iterator returns a relation (vertex property or in/out edge) to be parsed
     */
    protected PeekingIterator<IMizoRelationParser> relationsIterator;

    public MizoVerticesIterator(Iterator<IMizoRelationParser> relationsIterator, IMizoRDDConfig config) {
        super(config);

        this.relationsIterator = Iterators.peekingIterator(relationsIterator);
    }

    @Override
    public boolean hasNext() {
        return relationsIterator.hasNext();
    }

    @Override
    public MizoVertex next() {
        long lastVertexId = this.relationsIterator.peek().getVertexId();
        MizoVertex currentVertex = setupNewVertex(this.relationsIterator.peek());

        while (this.relationsIterator.hasNext() && lastVertexId == this.relationsIterator.peek().getVertexId()) {
            MizoEdge edgeOrNull = getEdgeOrNull(this.relationsIterator.next(), currentVertex);

            if (edgeOrNull != null) {
                if (edgeOrNull.isOutEdge()) {
                    currentVertex.initializedOutEdges().add(edgeOrNull);
                } else {
                    currentVertex.initializedInEdges().add(edgeOrNull);
                }
            }
        }

        return currentVertex;
    }
}