/*
 * Copyright (C) 2010, 2013 Google Inc. and others
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Distribution License v. 1.0 which is available at
 * https://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

package org.eclipse.jgit.util.io;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * Input stream that copies data read to another output stream.
 *
 * This stream is primarily useful with a
 * {@link org.eclipse.jgit.util.TemporaryBuffer}, where any data read or skipped
 * by the caller is also duplicated into the temporary buffer. Later the
 * temporary buffer can then be used instead of the original source stream.
 *
 * During close this stream copies any remaining data from the source stream
 * into the destination stream.
 */
public class TeeInputStream extends InputStream {
	private byte[] skipBuffer;

	private InputStream src;

	private OutputStream dst;

	/**
	 * Initialize a tee input stream.
	 *
	 * @param src
	 *            source stream to consume.
	 * @param dst
	 *            destination to copy the source to as it is consumed. Typically
	 *            this is a {@link org.eclipse.jgit.util.TemporaryBuffer}.
	 */
	public TeeInputStream(InputStream src, OutputStream dst) {
		this.src = src;
		this.dst = dst;
	}

	/** {@inheritDoc} */
	@Override
	public int read() throws IOException {
		byte[] b = skipBuffer();
		int n = read(b, 0, 1);
		return n == 1 ? b[0] & 0xff : -1;
	}

	/** {@inheritDoc} */
	@Override
	public long skip(long count) throws IOException {
		long skipped = 0;
		long cnt = count;
		final byte[] b = skipBuffer();
		while (0 < cnt) {
			final int n = src.read(b, 0, (int) Math.min(b.length, cnt));
			if (n <= 0)
				break;
			dst.write(b, 0, n);
			skipped += n;
			cnt -= n;
		}
		return skipped;
	}

	/** {@inheritDoc} */
	@Override
	public int read(byte[] b, int off, int len) throws IOException {
		if (len == 0)
			return 0;

		int n = src.read(b, off, len);
		if (0 < n)
			dst.write(b, off, n);
		return n;
	}

	/** {@inheritDoc} */
	@Override
	public void close() throws IOException {
		byte[] b = skipBuffer();
		for (;;) {
			int n = src.read(b);
			if (n <= 0)
				break;
			dst.write(b, 0, n);
		}
		dst.close();
		src.close();
	}

	private byte[] skipBuffer() {
		if (skipBuffer == null)
			skipBuffer = new byte[2048];
		return skipBuffer;
	}
}
