/*
	Class SearchURL
	This will accept the strings to be search and the array which has to be searched and return URL of result
*/
import java.util.*;

class SearchURL 
{
	public int counter;
	public int ucounter;
	public String[] URLArray = null;
	public String[] tokensArr = null;
	public int tokenCount;

	SearchURL()
	{
		counter =0;
		ucounter=0;
		tokenCount =0;
		URLArray = new String[250];
		tokensArr = new String[250];
	}

	public String[] findResults(String enteredString, String[][] noiseEliminatedArray)
	{
		String tokenStr = new String();
		tokenStr = "";

		StringTokenizer searchTokenAnd = null, searchTokenOr = null, searchTokenNot = null;
		int index =0, strIndex=0, flag=-1;
		//counter =0;		ucounter=0;		tokenCount =0;

		for(int i=0; i<250; i++) {
			URLArray[i]="";
			tokensArr[i]="";
		}

		// The user has entered enteredString
		// Search for AND, OR and NOT
		if(enteredString.indexOf("AND")!=-1) {			
			int andCount=0; ucounter=0;			
			int len=0; tokenCount=0;
			String temp = new String();
			temp = "";
			//searchTokenAnd = new StringTokenizer(enteredString, "AND");
			while(enteredString.indexOf("AND", andCount)!=-1) {
				andCount = enteredString.indexOf("AND", andCount);
				temp = enteredString.substring(len, andCount-1);
				tokensArr[tokenCount++] = temp.trim();
				//URLArray[ucounter++] = tokensArr[tokenCount-1];
				andCount+=3;
				len = andCount;
			}
			temp = enteredString.substring(andCount, enteredString.length());
			tokensArr[tokenCount++] = temp.trim();
			//URLArray[ucounter++] = tokensArr[tokenCount-1];
			//URLArray[ucounter++] = Integer.toString(tokenCount);
			flag = 1;
		}
		else if(enteredString.indexOf("OR")!=-1) {			
			int andCount=0; ucounter=0;			
			int len=0; tokenCount=0;
			String temp = new String();
			temp = "";
			//searchTokenAnd = new StringTokenizer(enteredString, "AND");
			while(enteredString.indexOf("OR", andCount)!=-1) {
				andCount = enteredString.indexOf("OR", andCount);
				temp = enteredString.substring(len, andCount-1);
				tokensArr[tokenCount++] = temp.trim();
				//URLArray[ucounter++] = tokensArr[tokenCount-1];
				andCount+=2;
				len = andCount;
			}
			temp = enteredString.substring(andCount, enteredString.length());
			tokensArr[tokenCount++] = temp.trim();
			//URLArray[ucounter++] = tokensArr[tokenCount-1];
			//URLArray[ucounter++] = Integer.toString(tokenCount);
			flag = 2;
		}
		/*
		else if(enteredString.indexOf("OR")!=-1) {
			searchTokenOr = new StringTokenizer(enteredString, "OR");
			flag = 2;
		}*/
		else if(enteredString.indexOf("NOT")!=-1) {			
			flag = 3;
		}
		else 
			flag = 0;
		
		// if AND contined in the search string
		if (flag==1)	{
			//ucounter=0; 
			counter=0;			
									
			// All the tokens are in the array
			// Search for them in the noise eliminated array
			for(index=0; index<noiseEliminatedArray.length-1; index++) {
				if(noiseEliminatedArray[index][0].startsWith(tokensArr[0]))	{
					counter++;
					//URLArray[ucounter++] = "Token = " + Integer.toString(tokenCount);
					for(int i=1; i<tokenCount; i++) {
						strIndex = noiseEliminatedArray[index][0].indexOf(tokensArr[i]);
						//URLArray[ucounter++] = Integer.toString(strIndex+tokensArr[i].length());
						//URLArray[ucounter++] = noiseEliminatedArray[index][0].substring(strIndex + tokensArr[i].length(), strIndex + tokensArr[i].length()+1);
						String spaceCheck = new String();
						if(strIndex==-1)
							break;

						if((strIndex!=-1)&&(noiseEliminatedArray[index][0].length() > (strIndex + tokensArr[i].length()+1)))
							spaceCheck = noiseEliminatedArray[index][0].substring(strIndex + tokensArr[i].length(), strIndex + tokensArr[i].length()+1);
						
						//if(!spaceCheck.equals(" "))
						//	break;

						//URLArray[ucounter++] = "AND Start Index = " + Integer.toString(strIndex);
						// If the string matches, increment counter
						counter++;
					}
					//URLArray[ucounter++] = "counter = " + Integer.toString(counter);
					// If all the strings have matched, write the URL in an array which will be returned
					if(counter==tokenCount)
						URLArray[ucounter++] = noiseEliminatedArray[index][1];
				}
			}
			//URLArray[ucounter++] = "exiting AND";
		}

		// if OR contined in the search string
		//else if(searchTokenOr.countTokens()!=0) {
		else if(flag==2) {			
			// All the tokens are in the array
			// Search for them in the noise eliminated array
			for(index=0; index<noiseEliminatedArray.length-1; index++) {
				for(int index1=0; index1<tokenCount; index1++) {
					if(noiseEliminatedArray[index][0].startsWith(tokensArr[index1])) {
						strIndex = noiseEliminatedArray[index][0].indexOf(tokensArr[index1]);
						String spaceCheck = noiseEliminatedArray[index][0].substring(strIndex + tokensArr[index1].length(), strIndex + tokensArr[index1].length()+1);

						//URLArray[ucounter++] = Integer.toString(strIndex+tokensArr[index1].length());
						//URLArray[ucounter++] = "Noise Check = " + noiseEliminatedArray[index][0].substring(strIndex + tokensArr[index1].length(), strIndex + tokensArr[index1].length()+1) + "is";
					

						if(spaceCheck.equals(" "))
							URLArray[ucounter++] = noiseEliminatedArray[index][1];
					}
				}
			}
			//URLArray[ucounter++] = "exiting OR";
		}

		// for NOT
		else if(flag==3) {
			int tokenCount=0;
			counter=0; ucounter=0;
			
			String searchNOT = enteredString.substring(4);
				
			searchTokenNot = new StringTokenizer(searchNOT);

			while(searchTokenNot.hasMoreTokens()) {
				tokensArr[tokenCount]=searchTokenNot.nextToken();
				tokensArr[tokenCount] = tokensArr[tokenCount].trim();
				tokenCount++;
			}

			for(index=0; index<noiseEliminatedArray.length-1; index++) {
				counter=0;
				for(int index1=0; index1<tokenCount; index1++) 
					if(noiseEliminatedArray[index][0].indexOf(tokensArr[index1])!=-1)
						counter++;

				if(counter==0)
					URLArray[ucounter++] = noiseEliminatedArray[index][1];
			}
		}

		// No case match, search for string in the start of array
		else if(flag==0){
			ucounter=0;
			for(index=0; index<noiseEliminatedArray.length-2; index++) {
				System.out.println(Integer.toString(index) +  noiseEliminatedArray[index][0]);
				if(noiseEliminatedArray[index][0].startsWith(enteredString))
					URLArray[ucounter++] = noiseEliminatedArray[index][1];
			}
			//URLArray[ucounter++] = "Exiting default condition";
		}
		//URLArray[ucounter++] = "returning from search";
		return URLArray;
		//return tokensArr;
	}
}
