import java.util.*;
import java.io.*;

/**
 * @author Scott Douglas ( scott@scottdouglas.net )
 */
public class FrequencyTable {
	public static void saveTableFromNodes( List allNonNullNodes, String filename, long numBits ) {
		System.out.println( "=Saving frequency table" );
		
		try {
			BufferedWriter outputFreq = new BufferedWriter( new FileWriter( filename ) );
			outputFreq.write( "" + numBits + "\n" );
			for ( int j = 0; j < allNonNullNodes.size(); j++ ) {
				HuffmanTreeNode aNode = ( HuffmanTreeNode ) allNonNullNodes.get( j );
				if ( aNode.getCharacter().getCharacter() == '\r' ) {
					outputFreq.write( "lf" + aNode.getCharacter().getFrequency() );
				} else if ( aNode.getCharacter().getCharacter() == '\n' ) {
					outputFreq.write( "nl" + aNode.getCharacter().getFrequency() );
				} else if (aNode.getCharacter().getCharacter() == '\t' ) {
					outputFreq.write( "tb" + aNode.getCharacter().getFrequency() );
				} else {
					outputFreq.write( "" + aNode.getCharacter().getCharacter() + aNode.getCharacter().getFrequency() );	
				}
				
				outputFreq.newLine();
			}
			outputFreq.flush();
			outputFreq.close();		
		} catch( IOException e ) {
			System.err.println( "HuffmanEncoder: IO Error" );
			System.exit( 0 );			
		}			
	}
	
	public static long getNumBitsToRead( String filename ) {
		long numBits = -1;
		
		try {
			BufferedReader input = new BufferedReader( new FileReader( filename ) );
			String line = input.readLine();
			numBits = Long.parseLong( line );
		} catch ( IOException e ) {
			System.err.println( "Error Getting Size of Compressed File: IOException" );
			System.exit( 0 );
		}		
		
		return numBits;
	}

	public static Collection getCharactersFromTable( String filename ) {
		Set characters = new HashSet();
		
		System.out.println( "=Loading frequency table" );
		
		try {
			BufferedReader input = new BufferedReader( new FileReader( filename ) );
			String line = null;
			char aChar = '\0';
			int freq = 0;
			
			// Skip the first line that contains the number of bits to read
			input.readLine();
			line = input.readLine();
			while ( line != null && line != "" ) {
				if ( line.substring( 0, 2 ).equals( "lf" ) ) {
					aChar = '\r';
					freq = Integer.parseInt( line.substring( 2, line.length() ) );
				} else if ( line.substring( 0,2 ).equals( "nl" ) ) {
					aChar = '\n';
					freq = Integer.parseInt( line.substring( 2, line.length() ) );
				} else if ( line.substring( 0,2 ).equals( "tb" ) ) {
					aChar = '\t';
					freq = Integer.parseInt( line.substring( 2, line.length() ) );
				} else {
					aChar = line.charAt( 0 );
					freq = Integer.parseInt( line.substring( 1, line.length() ) );
				}
				HuffmanCharacter aCharacter = new HuffmanCharacter( aChar, freq );
				characters.add( aCharacter );
				line = input.readLine();
			}
		} catch ( IOException e ) {
			System.err.println( "Error loading frequencies: IOException" );
			System.exit( 0 );
		}
		 
		return characters;
	}

}

