package org.paneris.spindent;

final class Indent extends Token {
	static final int MAX_INDENT= 4;
	static int indent;
	static char indentChar;

	static final String spacesArr[];
	private static final StringBuffer spacesBuf;
	static {
		spacesArr= new String[Engine.MAX_DEPTH*MAX_INDENT];
		spacesBuf= new StringBuffer(Engine.MAX_DEPTH*MAX_INDENT);
		reInit();
	}
	
	private int level=0;
	private int indentSpaces=0; //Small shift.

	Indent() { image=""; }

	Indent(Indent from) {	setFrom(from); }

	void setFrom(Indent from) {
		kind= ParserConstants.EOF; //any token ID that is not specially handled by Token.transform()
		level= from.level;
		indentSpaces= from.indentSpaces;
		image= from.image;
	}

	void  open() {
		level++;
		image= spaces(indentChars());
	}
	
	void close() {
		level= Math.max(level-1,0);
		image= spaces(indentChars());
	}

	/** @param delta +- shift in space characters*/
	void indentSpaces(int delta) throws Fault {
		indentSpaces+= delta;
		if(indentChars()<0)
			throw new InternalFault("negative resultant indentation");
		image= spaces(indentChars());
	}

	int indentChars() { return level*indent+indentSpaces; }
	
	public int getLevel() { return level; }
	public int getIndentSpaces() { return indentSpaces; }

	public static final Object synchro= new Object();

	static void reInit() {
		indent=2;
		indentChar=' ';
		for(int i=spacesArr.length-1; i>=0; i--)
			spacesArr[i]= null;
	}

	static String spaces(int i) {
		if( spacesArr[i]==null) {
			spacesBuf.setLength(i);
			int char_i= i;
			while( char_i-- >0)
				spacesBuf.setCharAt( char_i,indentChar);
			spacesArr[i]= spacesBuf.toString();
		}
		return spacesArr[i];
	}

	/** Debugging */
	static void checkTabs() {
		System.err.println( "Indent.spacesArr.length="+spacesArr.length);
		for(int i=0; i<spacesArr.length; i++) {
			String spaces= spacesArr[i];
			if(spaces!=null)
				System.err.println( "Indent.spacesArr[" +i+ "] is no-null:" +spaces.replace(' ','s').replace('\t','t') );
		}
	}
}