package clone;
import java.util.NoSuchElementException;
import util.nice.NiceIterator;
import util.nice.NiceEnumeration;
import misc.Separators;
import util.log.Log;
public class CloneAlgo {
  public static final int F_NAME  = 0;
  public static final int F_BRIEF = 1;
  public static void insert(CloneStore store, Clone clo) {
    if (store.isEmpty()) {
      store.insert(clo);
      return;
    }
    NiceIterator iter = store.getIterator();
    
    Clone curr = (Clone) iter.getCurrent(); 
  
    if (clo.isCloneOf(curr)) {
      store.insert(clo);
      return;
    }
    
    try {
      for ( ; ; iter.next()) {
	Clone next = (Clone) iter.getNext();
	if (clo.isCloneOf(next)) {
	  iter.insertNext(clo);
	  return;
	}
      }
    }
    catch(NoSuchElementException e) {
      store.insert(clo);
    }
  }
  static private String selectField(Clone clo, int field) {
    String str = null;
    switch(field) {
    case F_NAME:
      str = clo.getName();
      break;
    case F_BRIEF:
      str = clo.getBrief();
      break;
    }
    return str;
  }
    public static String getList(CloneStore store, Clone except, int field) {
	return getList(store, except, field, Separators.NL);
    }
  public static String getList(CloneStore store, Clone except, int field, String sep) {
    String cloneList = "";
    if (store.isEmpty()) 
      return cloneList;
    int count = 1;
    NiceEnumeration cloneEnum = store.elements();
    Clone prevClone = (Clone) cloneEnum.nextElement();
    if (prevClone == except)
      if (cloneEnum.hasMoreElements())
	prevClone = (Clone) cloneEnum.nextElement();
      else
	return cloneList;
    while (cloneEnum.hasMoreElements()) {
      Clone currClone = (Clone) cloneEnum.nextElement();
      if (currClone == except)  
	continue;
      else if (currClone.isCloneOf(prevClone))
	++count;
      else {
	cloneList += (count == 1) ? 
	  sep + selectField(prevClone, field) :
	  sep + "[" + String.valueOf(count) + "] " + 
	  selectField(prevClone, field);
	prevClone = currClone;
	count = 1;
      }
    }
    
    cloneList += (count == 1) ? 
      sep + selectField(prevClone, field) :
      sep + "[" + String.valueOf(count) + "] " + 
      selectField(prevClone, field);
    
    return cloneList;
  }
    public static String getHeadedList(CloneStore store, Clone except, int field) {
	return getHeadedList(store, except, field, Separators.NL);
    }
  public static String getHeadedList(CloneStore store, Clone except, int field, String sep) {
    String cloneList = "";
    if (store.isEmpty()) 
      return cloneList;
    int count = 1;
    int lines = 0;
    NiceEnumeration cloneEnum = store.elements();
    Clone prevClone = (Clone) cloneEnum.nextElement();
    if (prevClone == except)
      if (cloneEnum.hasMoreElements())
	prevClone = (Clone) cloneEnum.nextElement();
      else
	return cloneList;
    if (cloneEnum.hasMoreElements()) {
      Clone currClone = (Clone) cloneEnum.nextElement();
      if (currClone != except) {
	  if (currClone.isCloneOf(prevClone))
	      ++count;
	  else {
	      cloneList += (count == 1) ? 
		  selectField(prevClone, field) :
		  "[" + String.valueOf(count) + "] " + 
		  selectField(prevClone, field);
	      prevClone = currClone;
	      count = 1;
	      ++lines;
	  }
      }
    }
    while (cloneEnum.hasMoreElements()) {
      Clone currClone = (Clone) cloneEnum.nextElement();
      if (currClone == except)  
	continue;
      else if (currClone.isCloneOf(prevClone))
	++count;
      else {
	cloneList += (count == 1) ? 
	  sep + selectField(prevClone, field) :
	  sep + "[" + String.valueOf(count) + "] " + 
	  selectField(prevClone, field);
	prevClone = currClone;
	count = 1;
	++lines;
      }
    }
    
    if (lines == 0) 
	cloneList += (count == 1) ? 
	    selectField(prevClone, field) :
	"[" + String.valueOf(count) + "] " + 
	    selectField(prevClone, field);
    else
	cloneList += (count == 1) ? 
	    sep + selectField(prevClone, field) :
	sep + "[" + String.valueOf(count) + "] " + 
	    selectField(prevClone, field);
    
    return cloneList;
  }
}