package org.eclipse.cdt.internal.core.model;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.MessageFormat;

import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICLogConstants;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICModelStatusConstants;
import org.eclipse.cdt.internal.core.model.IDebugLogConstants.DebugLogConstant;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;

public class Util implements ICLogConstants {
	
	public static boolean VERBOSE_PARSER = false;
	public static boolean VERBOSE_MODEL = false;
	public static boolean VERBOSE_CONTENTASSIST = false;
	
	private Util() {
	}
	
	
	public static StringBuffer getContent(IFile file) throws IOException {
		InputStream stream = null;
		try {
			stream = new BufferedInputStream(file.getContents(true));
		} catch (CoreException e) {
			throw new IOException(e.getMessage());
		}
		try {
			char [] b = getInputStreamAsCharArray(stream, -1, null);
			return new StringBuffer(b.length).append(b);
		} finally {
			try {
				if (stream != null)
					stream.close();
			} catch (IOException e) {
			}
		}
	}

	/**
	 * Returns the given input stream's contents as a character array.
	 * If a length is specified (ie. if length != -1), only length chars
	 * are returned. Otherwise all chars in the stream are returned.
	 * Note this doesn't close the stream.
	 * @throws IOException if a problem occured reading the stream.
	 */
	public static char[] getInputStreamAsCharArray(InputStream stream, int length, String encoding)
		throws IOException {
		InputStreamReader reader = null;
		reader = encoding == null
			? new InputStreamReader(stream)
			: new InputStreamReader(stream, encoding);
		char[] contents;
		if (length == -1) {
			contents = new char[0];
			int contentsLength = 0;
			int charsRead = -1;
			do {
				int available = stream.available();

				// resize contents if needed
				if (contentsLength + available > contents.length) {
					System.arraycopy(
						contents,
						0,
						contents = new char[contentsLength + available],
						0,
						contentsLength);
				}

				// read as many chars as possible
				charsRead = reader.read(contents, contentsLength, available);

				if (charsRead > 0) {
					// remember length of contents
					contentsLength += charsRead;
				}
			} while (charsRead > 0);

			// resize contents if necessary
			if (contentsLength < contents.length) {
				System.arraycopy(
					contents,
					0,
					contents = new char[contentsLength],
					0,
					contentsLength);
			}
		} else {
			contents = new char[length];
			int len = 0;
			int readSize = 0;
			while ((readSize != -1) && (len != length)) {
				// See PR 1FMS89U
				// We record first the read size. In this case len is the actual read size.
				len += readSize;
				readSize = reader.read(contents, len, length - len);
			}
			// See PR 1FMS89U
		// Now we need to resize in case the default encoding used more than one byte for each
		// character
			if (len != length)
				System.arraycopy(contents, 0, (contents = new char[len]), 0, len);
		}

		return contents;
	}

	public static void save (StringBuffer buffer, IFile file) throws CoreException {
		byte[] bytes = buffer.toString().getBytes();
		ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
		// use a platform operation to update the resource contents
		boolean force = true;
		file.setContents(stream, force, true, null); // record history
	}
	
	/**
	 * Returns the given file's contents as a character array.
	 */
	public static char[] getResourceContentsAsCharArray(IFile file) throws CModelException {
		return getResourceContentsAsCharArray(file, null);
	}
	
	public static char[] getResourceContentsAsCharArray(IFile file, String encoding) throws CModelException {
		InputStream stream= null;
		try {
			stream = new BufferedInputStream(file.getContents(true));
		} catch (CoreException e) {
			throw new CModelException(e, ICModelStatusConstants.ELEMENT_DOES_NOT_EXIST);
		}
		try {
			return Util.getInputStreamAsCharArray(stream, -1, encoding);
		} catch (IOException e) {
			throw new CModelException(e, ICModelStatusConstants.IO_EXCEPTION);
		} finally {
			try {
				stream.close();
			} catch (IOException e) {
			}
		}
	}
	/*
	 * Add a log entry
	 */
	public static void log(Throwable e, String message, LogConst logType) {
		IStatus status= new Status(
			IStatus.ERROR, 
			CCorePlugin.getDefault().getDescriptor().getUniqueIdentifier(), 
			IStatus.ERROR, 
			message, 
			e); 
		Util.log(status, logType);			
	}	
	
	public static void log(IStatus status, LogConst logType){
	 if (logType.equals(ICLogConstants.PDE)){
			CCorePlugin.getDefault().getLog().log(status);		
	 } 
	 else if (logType.equals(ICLogConstants.CDT)){
			CCorePlugin.getDefault().cdtLog.log(status);
	 }	
	}
	
	public static void log(String message, LogConst logType){
		IStatus status = new Status(IStatus.INFO, 
		CCorePlugin.getDefault().getDescriptor().getUniqueIdentifier(), 
		IStatus.INFO,
		message,
		null);
		Util.log(status, logType);
	}
	
	public static void debugLog(String message, DebugLogConstant client) {
		Util.debugLog(message, client, true);
	}
	
	public static void debugLog(String message, DebugLogConstant client, boolean addTimeStamp) {
		if( CCorePlugin.getDefault() == null ) return;
		if ( CCorePlugin.getDefault().isDebugging() && isActive(client)) {
			// Time stamp
			if(addTimeStamp)
				message = MessageFormat.format( "[{0}] {1}", new Object[] { new Long( System.currentTimeMillis() ), message } );
			while (message.length() > 100) {
				String partial = message.substring(0, 100);
				message = message.substring(100);
				System.out.println(partial + "\\");
			}
			if (message.endsWith("\n")) {
				System.err.print(message);
			} else {
				System.out.println(message);
			}
		}
	}
	
	/**
	 * @param client
	 * @return
	 */
	public static boolean isActive(DebugLogConstant client) {
		if (client.equals(IDebugLogConstants.PARSER)){
			return VERBOSE_PARSER;
		}
		else if (client.equals(IDebugLogConstants.MODEL)){
			return VERBOSE_MODEL;
		}
		else if (client.equals(IDebugLogConstants.CONTENTASSIST)){
			return VERBOSE_CONTENTASSIST;
		}
		return false;
	}

	public static void setDebugging(boolean value){
		CCorePlugin.getDefault().setDebugging(value);
	}
	
	/**
	 * Combines two hash codes to make a new one.
	 */
	public static int combineHashCodes(int hashCode1, int hashCode2) {
		return hashCode1 * 17 + hashCode2;
	}
	/**
		 * Compares two arrays using equals() on the elements.
		 * Either or both arrays may be null.
		 * Returns true if both are null.
		 * Returns false if only one is null.
		 * If both are arrays, returns true iff they have the same length and
		 * all elements compare true with equals.
		 */
		public static boolean equalArraysOrNull(Object[] a, Object[] b) {
			if (a == b)	return true;
			if (a == null || b == null) return false;

			int len = a.length;
			if (len != b.length) return false;
			for (int i = 0; i < len; ++i) {
				if (a[i] == null) {
					if (b[i] != null) return false;
				} else {
					if (!a[i].equals(b[i])) return false;
				}
			}
			return true;
		}
		/**
		 * Compares two arrays using equals() on the elements.
		 * Either or both arrays may be null.
		 * Returns true if both are null.
		 * Returns false if only one is null.
		 * If both are arrays, returns true iff they have the same length and
		 * all elements are equal.
		 */
		public static boolean equalArraysOrNull(int[] a, int[] b) {
			if (a == b)
				return true;
			if (a == null || b == null)
				return false;
			int len = a.length;
			if (len != b.length)
				return false;
			for (int i = 0; i < len; ++i) {
				if (a[i] != b[i])
					return false;
			}
			return true;
		}

		/**
		 * Compares two objects using equals().
		 * Either or both array may be null.
		 * Returns true if both are null.
		 * Returns false if only one is null.
		 * Otherwise, return the result of comparing with equals().
		 */
		public static boolean equalOrNull(Object a, Object b) {
			if (a == b) {
				return true;
			}
			if (a == null || b == null) {
				return false;
			}
			return a.equals(b);
		}	
		
}
