﻿/**
 * @author Sebastian RÃ¼hl
 * @version 0.1
 * @category nonsense
 * 
 * KennyTranslator -- a kennyfier <br>
 * Copyright 2002 Kohan Ikin <syneryder@namesuppressed.com> <br>
 * Ported to JAVA by Sebastian RÃ¼hl<br>
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
public class KennyTranslator {

	/**
	* The KENNYLETTERS in alphabetical order. Big Letters are the Same with the
	* only difference That the First char is UpperCase
	*/
	public static final String[] KENNYLETTERS = { "mmm", "mmp", "mmf", "mpm",
			"mpp", "mpf", "mfm", "mfp", "mff", "pmm", "pmp", "pmf", "ppm",
			"ppp", "ppf", "pfm", "pfp", "pff", "fmm", "fmp", "fmf", "fpm",
			"fpp", "fpf", "ffm", "ffp" };

	private char translateKennyLetterToNormalLetter(String s) throws Exception {
		char[] input = s.toCharArray();
		boolean bigChar = (input[0] == Character.toUpperCase(input[0]));
		input[0] = Character.toLowerCase(input[0]);
		String tmp = new String(input);
		for (int i = 0; i < KENNYLETTERS.length; i++) {
			if (tmp.equals(KENNYLETTERS[i])) {
				return bigChar ? (char) (i + 'A') : ((char) (i + 'a'));
			}
		}
		throw new Exception(s + " is no Kenny Word!!!");
	}

	private String translateKennyToNormal(String s) {
		String result = "";
		stringiterate: for (int i = 0; i < s.length(); i = i + 3) {
			while (Character.toUpperCase(s.charAt(i)) != 'M'
					&& Character.toUpperCase(s.charAt(i)) != 'P'
					&& Character.toUpperCase(s.charAt(i)) != 'F') {
				result = result + s.charAt(i);
				i++;
				if (i == s.length()) {
					break stringiterate;
				}
			}
			try {
				result = result
						+ translateKennyLetterToNormalLetter(s.substring(i,
								i + 3));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return result;
	}

	private String translateNormalLetterToKennyLetter(char c) {
		if (c == Character.toUpperCase(c)) {
			char[] result = KENNYLETTERS[c - 'A'].toCharArray();
			result[0] = Character.toUpperCase(result[0]);
			return new String(result);
		} else {
			return KENNYLETTERS[c - 'a'];
		}
	}

	private String translateNormalToKenny(String s) {
		String result = "";
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			if (c < 'A' || (c > 'Z' && c < 'a') || c > 'z')
				result = result + c;
			// Ordered according to optimisations suggested by Stuart
			else {
				result = result + translateNormalLetterToKennyLetter(c);
			}
		}
		return result;
	}

	private boolean isKenny(String s) {
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			if ((c >= 'a' && c <= 'z' && c != 'm' && c != 'f' && c != 'p')
					|| (c >= 'A' && c <= 'Z' && c != 'M' && c != 'F' && c != 'P')) {
				return false;
			}
		}
		return true;
	}

	/**
	* @param s
	*            String to Translate
	* @return translated String
	*/
	public String translate(String s) {
		if (isKenny(s)) {
			return translateKennyToNormal(s);
		} else {
			return translateNormalToKenny(s);
		}
	}

	/**
	* @param args
	*            String to Translate
	*/
	public static void main(String[] args) {
		if (args.length < 1) {
			System.err.println(showUsage());
			System.exit(1);
		} else {
			String toTranslate = args[0];
			for (int i = 1; i < args.length; i++) {
				toTranslate = toTranslate + ' ' + args[i];
			}
			System.out.println(new KennyTranslator().translate(toTranslate));
		}
	}

	/**
	* @return the Usage of Programm
	*/
	public static String showUsage() {
		return "kennytranslator text-to-translate";
	}
}
