#include "include/playunfair.h"
#include <fstream>


int main(int argc, char *argv[]){
	if(argc!=3){
		std::cout << "Uso: ./playunfair <file-in> <dicionarion>" << std::endl;
		return 0;
	}
	std::fstream input, output, dict;
	char *inputName, *dictName;
	std::string aux="", key, crip;
	std::ostringstream text, keys;

	inputName = argv[1];
	dictName = argv[2];

	input.open(inputName, std::ifstream::in);
	if(!input.good()){
		std::cout << "Nao foi possivel abrir o arquivo de entrada" << std::endl;
		return 0;
	}

	while(std::getline(input, aux))
		 text << aux;

	crip = text.str();
	parser(crip);

	dict.open(dictName, std::ifstream::in);
	if(!dict.good()){
		std::cout << "Nao foi possivel abrir o dicionario" << std::endl;
		return 0;
	}

	while(std::getline(dict, aux)){
		keys << aux;
		key = keys.str();
		crip = playfair(crip, key, DECRYPT);
		if(filter(crip)==ACCEPTED){
			std::cout << key << ": " << crip << std::endl;
		}
		keys.str("");
		keys.clear();
	}

	//std::cout << crip << std::endl;
	return 0;
}

void parser(std::string &text){
	text.erase(std::remove(text.begin(), text.end(), ' '), text.end());
	std::transform(text.begin(), text.end(), text.begin(), ::tolower);
}

int filter(std::string text){
	//TODO: if ( 4 primeiras letras sem vogal ||
	//           3 char -('o') iguais seguidos ||
	//           5 consoantes ||
	//           7 vogais ||
	//           'q' + !'u' ||
	//           ('c'|'d'|'f'|'h'|'k'|'p'|'q'|'w'|'y') + !(vogal|'r'|'h')
	//
	//          )
	//         { elimina texto: muda pra proxima chave}
	return (filter1(text) && filter2(text) && filter3(text));
}

int isVowel(char c){
	int result;
	result = (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
		return result;
}

int filter1(std::string text){
	int rej = REJECTED;
	for(int i=0; i<4; ++i){
		if(text[i] == 'a' || text[i] == 'e' || text[i] == 'i' || text[i] == 'o' ||
			 text[i] == 'u'){
			rej = ACCEPTED;
			break;
		}
	}
	return rej;
}

int filter2(std::string text){
	size_t i, j;
	int rej = ACCEPTED;
	for(i=0; i<text.size()-3; ++i){
		char l = text[i];
		int lim=3, cont=0;
		if ( l=='o')
			continue;
		for(j=i+1; j<i+lim; ++j){
			if(text[j]=='x'){
				++lim;
				continue;
			} else if (text[j] == l){
				++cont;
				continue;
			} else if (text[j] != l){
				break;
			}
		}
		if(cont == 2 ) {
			rej = REJECTED;
			break;
		}
	}

	return rej;
}

int filter3(std::string text){
	size_t i, j;
	int rej = ACCEPTED;
	for(i=0; i<text.size()-5; ++i){
		int lim = 5, cont = 0;
		char l = text[i];
		if(isVowel(l))
			continue;
		for(j=i+1; j<i+lim; ++j){
			if(text[j]=='x'){
				++lim;
				continue;
			} else if (!isVowel(text[j])){
				++cont;
			} else if(isVowel(text[j])){
				break;
			}
		}
		if(cont==5){
			rej = REJECTED;
			break;
		}
	}
	return rej;
}