package jfxtras.icalendarfx.content;

import java.util.Iterator;

/**
 * A simple {@code Iterator<String>} decorator that unfolds line according to the 
 * RFC 5545 iCalendar standard.  Lines are unfolded automatically by calling the next() method.
 * Non-folded lines are preserved by using a push-back mechanism. 
 * 
 * @author David Bal
 *
 */
public class UnfoldingStringIterator implements Iterator<String>
{
    /** The iterator being decorated. */
    private final Iterator<String> iterator;
    
    private String lastLine;
    
    /**
     * Constructor.
     *
     * @param iterator  the iterator to decorate as unfolding
     */
    public UnfoldingStringIterator(final Iterator<String> iterator)
    {
        super();
        this.iterator = iterator;
    }
    
    @Override
    public boolean hasNext()
    {
        return (lastLine != null) ? true : iterator.hasNext();
    }

    @Override
    public String next()
    {
        StringBuilder builder = new StringBuilder(200);
        if (lastLine != null)
        {
            builder.append(lastLine);
            lastLine = null;
        } else
        {
            builder.append(iterator.next());
        }
        boolean isContinuationLine = false;
        String currentLine = (iterator.hasNext()) ? iterator.next() : null;
        while (currentLine != null)
        {
            if (! currentLine.isEmpty())
            {
                isContinuationLine = (currentLine.charAt(0) == ' ') || (currentLine.charAt(0) == '\t');
                if (isContinuationLine)
                {
                    builder.append(currentLine.substring(1, currentLine.length()));
                } else
                {
                    break;
                }
            }
            currentLine = iterator.next();
        }
        pushBackLine(currentLine);
        return builder.toString();
    }
    
    private void pushBackLine(String s)
    {
        lastLine = s;
    }

}
