/*
 * "Grundkurs Programmieren in Java - Band 1 (4. Auflage, 2007)"
 * 2001-2007, Carl Hanser Verlag
 * Loesungsvorschlag zu Aufgabe 6.3 (Version 1.1)
 * (c) 2001-2007 D. Ratz, J. Scheffler, D. Seese, J. Wiesenberger
 *
 * Terminkalender fuer die Jahre 2000 bis 2009 unter Beruecksichtigung von Schaltjahren
 *
 */

import Prog1Tools.IOTools;

public class TerminKalender {

  public static void main(String[] args) {

    boolean fertig;
    int auswahl;
    int jahr, monat, tag, stunde;
    int hilf;

    // 4-dim-Feld f. Termine einrichten einrichten
    String[][][][] termine; // Indizierung: termine[jahr][monat][tag][stunde]
    termine=new String[10][12][][];  // fuer 10 Jahre mit jeweils 12 Monaten

    // wir tun zunaechst so, als haetten jeder Februar 28 Tage und
    // korrigieren dies im Anschluss fuer die 3 Schaltjahre im betrachteten
    // Zeitraum
    for (jahr = 0; jahr < termine.length; jahr++)
      for (monat = 0; monat < termine[jahr].length; monat++) {
        switch ( monat ) {
          case  0 : termine[jahr][monat] = new String[31][24]; break; // Januar
          case  1 : termine[jahr][monat] = new String[28][24]; break; // Februar (in 'normalen' Jahren)
          case  2 : termine[jahr][monat] = new String[31][24]; break; // Maerz
          case  3 : termine[jahr][monat] = new String[30][24]; break; // April
          case  4 : termine[jahr][monat] = new String[31][24]; break; // Mai
          case  5 : termine[jahr][monat] = new String[30][24]; break; // Juni
          case  6 : termine[jahr][monat] = new String[31][24]; break; // Juli
          case  7 : termine[jahr][monat] = new String[31][24]; break; // August
          case  8 : termine[jahr][monat] = new String[30][24]; break; // September
          case  9 : termine[jahr][monat] = new String[31][24]; break; // Oktober
          case 10 : termine[jahr][monat] = new String[30][24]; break; // November
          case 11 : termine[jahr][monat] = new String[31][24]; break; // Dezember
          default : System.out.println( "Schwerer interner Fehler!" );
        }
      }

    // Anzahl der Monate f. die Schaltjahre (2000, 2004, 2008) korrigieren
    // ... um die 'alten Februar-Felder' kümmert sich der Garbage-Collector
    termine[0][1] = new String[29][24]; // Jahr 2000
    termine[4][1] = new String[29][24]; // Jahr 2004
    termine[8][1] = new String[29][24]; // Jahr 2008

    // leere Startwerte fuer alle Felder
    for (jahr = 0; jahr < termine.length; jahr++)
      for (monat = 0; monat < termine[jahr].length; monat++)
        for (tag = 0; tag < termine[jahr][monat].length; tag++)
          for (stunde = 0; stunde < termine[jahr][monat][tag].length; stunde++)
            termine[jahr][monat][tag][stunde] = "";

    fertig = false;
    while ( !fertig ) { // *** Hauptschleife ***

      // Zuerst ein Bildschirmmenue
      System.out.println();
      System.out.println( "1 = Neuer Eintrag"    );
      System.out.println( "2 = Termine ausgeben" );
      System.out.println( "3 = Programm beenden" );
      auswahl = IOTools.readInteger( "Ihre Wahl: " );

      switch ( auswahl ) {

        // *** Menue-Punkt 1: neuer Termin-Eintrag ***
        case 1:

          jahr = IOTools.readInteger( "Welches Jahr (2000-2009)? " );
          jahr -= 2000; // Index-Korrektur
          if ( jahr < 0 || jahr > 9 ) {
            System.out.println( "Fehler: Unzulaessige Eingabe fuer Jahr!" );
            break;
          }

          monat = IOTools.readInteger( "Welcher Monat (1-12)? " );
          monat -= 1; // Index-Korrektur
          if ( monat < 0 || monat > 11 ) {
            System.out.println( "Fehler: Unzulaessige Eingabe fuer Monat!" );
            break;
          }

          // wieviel Tage gibt es im gewaehlten Monat?
          hilf = termine[jahr][monat].length;

          tag = IOTools.readInteger( "Welcher Tag (1-" + hilf + ")? " );
          tag -= 1; // Index-Korrektur
          if ( tag < 0 || tag >= hilf ) {
            System.out.println( "Fehler: Unzulaessige Eingabe fuer Tage!" );
            break;
          }

          stunde = IOTools.readInteger( "Welche Stunde (0-23)? " );
          if ( stunde < 0 || stunde > 23 ) {
            System.out.println( "Fehler: Unzulaessige Eingabe fuer Stunde!" );
            break;
          }

          termine[jahr][monat][tag][stunde] = IOTools.readLine( "Eintrag: " );

        break;

        // *** Menue-Punkt 2: Termine ausgeben ***
        case 2:

          jahr = IOTools.readInteger( "Welches Jahr (2000-2009)? " );
          jahr -= 2000; // Index-Korrektur
          if ( jahr < 0 || jahr > 9 ) {
            System.out.println( "Fehler: Unzulaessige Eingabe fuer Jahr!" );
            break;
          }

          monat = IOTools.readInteger( "Welcher Monat (1-12)? " );
          monat -= 1; // Index-Korrektur
          if ( monat < 0 || monat > 11 ) {
            System.out.println( "Fehler: Unzulaessige Eingabe fuer Monat!" );
            break;
          }

          // wieviel Tage gibt es im gewaehlten Monat?
          hilf = termine[jahr][monat].length;

          tag = IOTools.readInteger( "Welcher Tag (1-" + hilf + ")? " );
          tag -= 1; // Index-Korrektur
          if ( tag < 0 || tag >= hilf ) {
            System.out.println( "Fehler: Unzulaessige Eingabe fuer Tage!" );
            break;
          }

          // alle Kalendereintraege fuer den gewaehlten Tag ausgeben
          System.out.println( "Termine am " + (tag + 1) + "." + (monat + 1) + "." + (jahr + 2000) + ":" );
          for (stunde = 0; stunde < termine[jahr][monat][tag].length; stunde++)
            System.out.println( stunde + " Uhr: " + termine[jahr][monat][tag][stunde] );


        break;

        // *** Menue-Punkt 3: Programm-Ende! ***
        case  3:
            fertig = true;
            System.out.println( "\n... und tschuess!" );
        break;

        // *** Unzulaessige Zahl als Menue-Punkt eingegeben ***
        default:
            System.out.println("Eingabefehler! Nur die Werte 1, 2 und 3 sind erlaubt!");

      } // switch

    } // while


  }
}
