/****************************************/
/** EPROG Runde 1: Bsp. 1148 (mittel)  **/
/** Programmierer: Michael Zöch        **/
/** Matrikelnummer: 0305116            **/
/** E-mail: kongo@gmx.at               **/
/** HP: www.8ung.at/kongo/index.html   **/
/****************************************/

import java.util.*;
import eprog.*;

public class Notcheck extends EprogIO
{
	// Konstanten	
	static final char KREUZ = '#';                                    // Zeichen für einen Halbtonschritt weiter
	static final String CHROMTL = "c c# d d# e f f# g g# a a# h";     // chromatische Tonleiter
	static final String[] TON = {"c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h"};   // mögliche Töne
	static final String[] TONARTEN = {"Dur", "moll"};                 // mögliche Tonarten
	static final int IND_DUR = 0;                                     // Index für TONARTEN
	static final int IND_MOLL = 1;                                    // Index für TONARTEN
	static final int[] DURINDEX = {2,2,1,2,2,2,1};                    // Indexliste in TON für Dur-Tonart
	static final int[] MOLLINDEX = {2,1,2,2,1,2,2};                   // Indexliste in TON für Moll-Tonart
	static final char TRENNZEICHEN = '-';                             // Trennzeichen bei "Note-Tonart"
	static final int MAXLENGTH_NOTEN = 30;                            // maximale Länge des Notenstrings
	
	public static void main(String[] args)
	{
		String tonart = "", tonartnote = "";                      // zweiter Eingabe-String: "Note-Tonart"
		ArrayList vecnoten = new ArrayList();                     // Ein Array der Eingabe-Töne
		boolean err = true;                                       // true wenn Fehler in Eingabe
		int i = 0;                                                // Index Variable für Schleifen

		// do-while Schleife die bei Fehler sofort verlassen wird
		// dadurch wird err nur einmal überprüft
		loop_check:
		do {

			String noten = "";                // erster Eingabe-String (die Noten)

			String checknote = "";            // eine einzelne Note

			int posTrennzeichen;              // Position des Trennzeichens in "Note-Tonart"

			// Noten einlesen und Länge prüfen
			noten = readWord();
			if (noten.length() > MAXLENGTH_NOTEN)
				break;	// FEHLER
			
			// jede Note überprüfen und wenn in chromTl dann als eigener String in vecnoten speichern
			final int notenlength = noten.length();
			noten += " ";        // um OutOfBounds-Exception zu verhindern ( bei Zugriff noten.charAt(i+1) )

			do {

				// einzelne Note in checknote speichern, zb. "c" oder "c#"
				if (noten.charAt(i+1) == KREUZ) {
					checknote = noten.substring(i,i+2);
					i += 2;	
				} else {
					checknote = noten.substring(i,i+1);
					i++;
				}

				// checknote prüfen, ob in chromatischer Tonleiter
				if (checknote.charAt(0) != KREUZ && CHROMTL.indexOf(checknote) != -1)
					vecnoten.add(checknote);
				else
					break loop_check;  // FEHLER

			} while (i < notenlength);

			// Noten sind korrekt
			// jetzt Tonart einlesen

			tonart = readWord();
			posTrennzeichen = tonart.indexOf(TRENNZEICHEN);
			if (posTrennzeichen <= 0)
				break;

			// Note und Tonart in eigenen String schreiben
			tonartnote = tonart.substring(0,posTrennzeichen);
			tonart = tonart.substring(posTrennzeichen+1);

			// prüfen ob Note in chromatischer Tonleiter
			if (tonartnote.charAt(0) == KREUZ || CHROMTL.indexOf(tonartnote) == -1)
				break;

			// prüfen of richtige Tonart
			/*for (i = 0; i < TONARTEN.length; i++) {
				if (tonart.equals(TONARTEN[i])) {
					break;	
				}
			}
			if (i == TONARTEN.length)
				break;*/
			if (!tonart.equals(TONARTEN[0]) && !tonart.equals(TONARTEN[1]))
				break;

			// wenn hier angelangt gab es keinen Fehler im Einlesen der Noten & Tonart
			err = false;	

		} while (false);

		if (err) {
			println("FALSCHE EINGABE");
			return;	
		}

		// Ausgabe ermitteln
		int[] indexes;                                // Indexes für Dur/moll
		int noten_offset, noten_add;                  // Zur Berechnung der Noten
		String tonartnoten = "";                      // die möglichen Töne der eingegebenen Tonart

		if (tonart.equals(TONARTEN[IND_DUR])) {
			// Tonart ist Dur -> Array mit Dur-Indexes
			indexes = DURINDEX;
		}
		else {
			// Tonart ist moll -> Array mit moll-Indexes
			indexes = MOLLINDEX;
		}

		// die erste Note der Tonart bestimmten und darauf ein Offset in das Array TON speichern
		noten_offset = -1;
		do {
			noten_offset++;
		} while (tonartnote.equals(TON[noten_offset]) == false);

		// erlaubte Töne ermitteln
		noten_add = 0;
		for (i=0; i < 7; i++) {
			tonartnoten += TON[(noten_offset+noten_add) % TON.length] + " ";
			noten_add += indexes[i];
		}
		
		// Ausgabe
		boolean klammer = false;   // wurde eine Klammer geöffnet
		String output = "";        // Ausgabestring
		
		for (i=0; i < vecnoten.size(); i++) {
			if (tonartnoten.indexOf((String)vecnoten.get(i)) != -1){
				// Ton kommt in Tonart vor
				if (klammer) {
					// Klammer schließen
					output += ")";
					klammer = false;
				}
				output += (String)vecnoten.get(i);
			} else {
				// Ton kommt nicht in Tonart vor
				if (!klammer) {
					// Klammer öffnen
					output += "(";
					klammer = true;
				}
				output += (String)vecnoten.get(i);
			}
		}
		
		// eine geöffnete Klammer wieder schließen
		if (klammer)
			output += ")";
			
		println();
		println(tonartnote+"-"+tonart);
		println("Tonart-Noten: " + tonartnoten);	
		println("Ausgabe: " + output);
		
	}  // void main
	
}  // public Notcheck