/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.chemistry.opencmis.client.runtime.util;

import java.util.Iterator;
import java.util.List;

import org.apache.chemistry.opencmis.client.runtime.util.AbstractPageFetcher.Page;

/**
 * Abstract <code>Iterator</code> implementation.
 *
 * @param <T> the type returned by the iterator
 */
public abstract class AbstractIterator<T> implements Iterator<T> {

    private long skipCount;
    private int skipOffset;
    private final AbstractPageFetcher<T> pageFetcher;

    private Page<T> page;
    private Long totalNumItems;
    private Boolean hasMoreItems;

    /**
     * Construct
     *
     * @param skipCount
     * @param pageFetcher
     */
    protected AbstractIterator(long skipCount, AbstractPageFetcher<T> pageFetcher) {
        this.skipCount = skipCount;
        this.pageFetcher = pageFetcher;
    }

    public long getPosition() {
        return skipCount + skipOffset;
    }

    public long getPageNumItems() {
        Page<T> currentPage = getCurrentPage();
        if (currentPage != null) {
            List<T> items = currentPage.getItems();
            if (items != null) {
                return items.size();
            }
        }
        return 0L;
    }

    public long getTotalNumItems() {
        if (totalNumItems == null) {
            totalNumItems = Long.valueOf(-1);
            Page<T> currentPage = getCurrentPage();
            if (currentPage != null) {
                // set number of items
                if (currentPage.getTotalNumItems() != null) {
                    totalNumItems = currentPage.getTotalNumItems();
                }
            }
        }
        return totalNumItems.longValue();
    }

    public boolean getHasMoreItems() {
        if (hasMoreItems == null) {
            hasMoreItems = Boolean.FALSE;
            Page<T> currentPage = getCurrentPage();
            if (currentPage != null) {
                if (currentPage.getHasMoreItems() != null) {
                    hasMoreItems = currentPage.getHasMoreItems();
                }
            }
        }
        return hasMoreItems.booleanValue();
    }

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

    /**
     * Gets current skip count
     *
     * @return skip count
     */
    protected long getSkipCount() {
        return skipCount;
    }

    /**
     * Gets current skip offset (from skip count)
     *
     * @return skip offset
     */
    protected int getSkipOffset() {
        return skipOffset;
    }

    /**
     * Increment the skip offset by one
     *
     * @return incremented skip offset
     */
    protected int incrementSkipOffset() {
        return skipOffset++;
    }

    /**
     * Gets the current page of items within collection
     *
     * @return current page
     */
    protected Page<T> getCurrentPage() {
        if (page == null) {
            page = pageFetcher.fetchPage(skipCount);
        }
        return page;
    }

    /**
     * Skip to the next page of items within collection
     *
     * @return next page
     */
    protected Page<T> incrementPage() {
        skipCount += skipOffset;
        skipOffset = 0;
        totalNumItems = null;
        hasMoreItems = null;
        page = pageFetcher.fetchPage(skipCount);
        return page;
    }

}
