/* ====================================================================
   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.poi.hdgf.streams;

import java.util.ArrayList;

import org.apache.poi.hdgf.chunks.Chunk;
import org.apache.poi.hdgf.chunks.ChunkFactory;
import org.apache.poi.hdgf.chunks.ChunkHeader;
import org.apache.poi.hdgf.pointers.Pointer;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;

public final class ChunkStream extends Stream {
	private final static POILogger logger = POILogFactory.getLogger(ChunkStream.class);
	
	private ChunkFactory chunkFactory;
	/** All the Chunks we contain */
	private Chunk[] chunks;

	protected ChunkStream(Pointer pointer, StreamStore store, ChunkFactory chunkFactory) {
		super(pointer, store);
		this.chunkFactory = chunkFactory;

		// For compressed stores, we require all of the data
		store.copyBlockHeaderToContents();
	}

	public Chunk[] getChunks() { return chunks; }

	/**
	 * Process the contents of the stream out into chunks
	 */
	public void findChunks() {
		ArrayList<Chunk> chunksA = new ArrayList<Chunk>();

		if(getPointer().getOffset() == 0x64b3) {
			int i = 0;
			i++;
		}

		int pos = 0;
		byte[] contents = getStore().getContents();
		try {
			while(pos < contents.length) {
				// Ensure we have enough data to create a chunk from
				int headerSize = ChunkHeader.getHeaderSize(chunkFactory.getVersion());
				if(pos+headerSize <= contents.length) {
					Chunk chunk = chunkFactory.createChunk(contents, pos);
					chunksA.add(chunk);

					pos += chunk.getOnDiskSize();
				} else {
					logger.log(POILogger.WARN, "Needed " + headerSize + " bytes to create the next chunk header, but only found " + (contents.length-pos) + " bytes, ignoring rest of data");
					pos = contents.length;
				}
			}
		}
		catch (Exception e)
		{
			logger.log(POILogger.ERROR, "Failed to create chunk at " + pos + ", ignoring rest of data." + e);
		}

		chunks = chunksA.toArray(new Chunk[chunksA.size()]);
	}
}
