/*
 * Copyright 2010 JBoss Inc
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.drools.repository;

import java.util.Iterator;
import java.util.NoSuchElementException;

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

/**
 * Implements the Iterator interface, allowing iteration over the version history of versionableItem 
 * nodes
 */
class ItemVersionIterator implements Iterator {
    private static final Logger log = LoggerFactory.getLogger(ItemVersionIterator.class);
    
    private VersionableItem currentVersionableItem;
    private int iterationType;
    
    public static final int ITERATION_TYPE_SUCCESSOR = 1;
    public static final int ITERATION_TYPE_PREDECESSOR = 2;

    public ItemVersionIterator(VersionableItem versionableItem, int iterationType) {
        this.currentVersionableItem = versionableItem;
        this.iterationType = iterationType;
    }
    
    public boolean hasNext() {
        if(this.currentVersionableItem == null) {
            return false;
        }
        
        if(this.iterationType == ITERATION_TYPE_SUCCESSOR) {
            return (this.currentVersionableItem.getSucceedingVersion() != null);
        }
        else if(this.iterationType == ITERATION_TYPE_PREDECESSOR) {
            return (this.currentVersionableItem.getPrecedingVersion() != null);
        }
        else {
            //shouldn't reach this block
            log.error("Reached unexpected path of execution because iterationType is set to: " + this.iterationType);
            return false;
        }
    }

    public Object next() {
        if(this.iterationType == ITERATION_TYPE_SUCCESSOR) {
            this.currentVersionableItem = this.currentVersionableItem.getSucceedingVersion();
        }
        else if(this.iterationType == ITERATION_TYPE_PREDECESSOR) {
            this.currentVersionableItem = this.currentVersionableItem.getPrecedingVersion();
        }
        else {
            //shouldn't reach this block
            log.error("Reached unexpected path of execution because iterationType is set to: " + this.iterationType);
            return null;
        }
        
        if(this.currentVersionableItem == null) {
            throw new NoSuchElementException();
        }
        return this.currentVersionableItem;
    }

    public void remove() {
        throw new UnsupportedOperationException();
    }
}
