
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.File;
import java.io.PrintStream;
import java.util.Vector;

public class Oikura {
	Vector<File> inputFile;
	Vector<File> outputFile;
	int start;
	int end;
	int pos;
	String left; 
	int window = 20;  // must be 20
	
	public static void main(String[] args) throws FileNotFoundException,IOException{
		Oikura howMuch = new Oikura();
		boolean succeed = howMuch.setParameters(args);
		if( !succeed ){
			howMuch.Usage();
			System.exit(0);
		}
		// 1st path ... counting occurrences
		for(int i=0;i<howMuch.inputFile.size();i++){
			BufferedReader d0 = new BufferedReader(new FileReader(howMuch.inputFile.elementAt(i)));
			PrintStream p0 = new PrintStream(howMuch.outputFile.elementAt(i));
	        try{
	            while(true){
	                String str = d0.readLine();
	                howMuch.put(str,p0);
	            }
	        }catch(EOFException e){   // end of file
	        }catch(NullPointerException e){}
	        catch(FileNotFoundException e){}
	        d0.close();
		}

	}

	public void Usage() {
		System.out.println("Usage:");
		System.out.println("java Unique -i data.txt -s 100 -e 200");
	}
	public Oikura(){
		inputFile = new Vector<File>();
		outputFile = new Vector<File>();
		start = end = pos = 0; // default;
		left = new String();
	}

	public void put(String seq, PrintStream p0){
		if ( seq==null ) throw new NullPointerException();  // no data
        if ( (seq.length()==0) || (seq.charAt(0)=='>') ) {
        	return; // title
        }
        for(int i=0;i<seq.length();i++){
			char c = seq.charAt(i);//
//			System.out.println( (int) c);
			pos ++;
			if(Character.isUpperCase(c)){
				if( (start<= pos)&&(pos<=end) ) {
					int len = left.length();
					p0.print(pos);
			        String data = left + seq;
			        String tag = (data.substring(i-window+len, i+len)).toUpperCase();
			        p0.print("\t");
			        p0.print(tag);				
			        String rev = reverse(tag);
			        p0.print("\t");
			        p0.print(rev);				
			        p0.println();				
				}
			}
		}
		if(seq.length()>(window-1)){ // left 
    		left = seq.substring(seq.length()-window+1);//amari
		}else{
			left = seq;
		}
	}

	public String reverse(String forward){
		StringBuffer result = new StringBuffer();
		for(int i=0;i<forward.length();i++){
			char comp = 'N';
			char nuc = forward.charAt(i);
			if(nuc=='T') comp = 'A';
			if(nuc=='C') comp = 'G';
			if(nuc=='A') comp = 'T';
			if(nuc=='G') comp = 'C';
			result.insert(0,comp);
		}
		return result.toString();
	}
	
	public boolean setParameters(String[] args){
		boolean success = false;
		if(args.length==0) return false;  // no data
		int input = 1;
		int inputDir = 2;
		int outputDir = 3;
		int startAssign = 4;
		int endAssign = 5;
		int argState = input; //default
		String inputPath = System.getProperty("user.dir");  // current dir
		String outputPath = "output";
		Vector<String> fileList = new Vector<String>();
		for(int i=0;i<args.length;i++){
			if (args[i].charAt(0)=='-') { // flag
				if( args[i].equals("-i") )  argState = input;
				if( args[i].equals("-w") )  argState = inputDir;				
				if( args[i].equals("-o") )  argState = outputDir;				
				if( args[i].equals("-s") )  argState = startAssign;				
				if( args[i].equals("-e") )  argState = endAssign;				
			}else{
				if(argState==input)       fileList.add(args[i]);
				if(argState==inputDir)    inputPath  = args[i];
				if(argState==outputDir)   outputPath = args[i];
				if(argState==startAssign) start  = (new Integer(args[i])).intValue();
				if(argState==endAssign)   end = (new Integer(args[i])).intValue();
			}
		}
		File f = new File(outputPath);
		if( !(f.exists()) ) f.mkdirs();
		for(int i=0;i<fileList.size();i++){
			inputFile.add(new File(inputPath,fileList.elementAt(i)));
			outputFile.add(new File(outputPath,fileList.elementAt(i)));
		}
		success = true;
		return success;
	}
}
