package org.eclipse.epf.library.edit.util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.epf.common.utils.FileUtil;
import org.eclipse.epf.uma.MethodElement;

/**
 * Utility class for logging debug info
 * @author Weiping Lu
 *
 */
public class DebugLog {

	private String indent; //$NON-NLS-1$
	private static String prompt;
	public DebugLog(String prompt) {
		this.prompt = prompt;
		int n = 5 + (prompt == null ? 0 : prompt.length());
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < n; i++) {
			sb.append(" ");	//$NON-NLS-1$
		}
		indent = sb.toString();
	}
		
	public void log(String msg) {
		FileUtil.log(prompt + msg);
	}
	
	public void logElements(String label, Collection<? extends MethodElement> elements, boolean showEmpty) {
		logElements(label, elements, showEmpty, true);
	}
	
	public void logElements(String label, Collection<? extends MethodElement> elements, boolean showEmpty, boolean showTags) {
		boolean empty = elements == null || elements.isEmpty();
		if (!showEmpty && empty) {
			return;
		}
		String str = prompt + label;	//$NON-NLS-1$
		
		if (!empty) {
			str += " size = " + elements.size();//$NON-NLS-1$			
			
			List<MethodElement> sortedElements = new ArrayList<MethodElement>(elements);			
			Collections.sort(sortedElements, Comparators.NAME_GUID_COMPARATOR);
			
			for (MethodElement element : sortedElements) {
				String line = "\n" + indent + toString(element, 2, showTags, indent + indent);//$NON-NLS-1$
				str += line;
			}
			
		} else {
			str += "\n" + indent + "Empty list";		//$NON-NLS-1$ //$NON-NLS-2$
		}
		FileUtil.log(str + "\n");//$NON-NLS-1$
	}
	
	public String toString(MethodElement element, int ix, boolean showTags, String tagLineInden) {
		return DebugUtil.toString(element, ix);
	}
		
}
