package javacodebook.core.calpage;

import java.util.Calendar;

public class CalPage {
    private int year, month;
    
    private String []mStr = {
        "Jan", "Feb", "Mar", "Apr", "Mai", "Jun", 
        "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"
    };
    
    public CalPage(int year, int month) {
        this.year = year;
        this.month = month;
    }
    
    public void print() {
        int firstDay;  // Der Wochtag des Ersten Monatstages
        int week;      // Die Kalenderwoche
        int days;      // Die Anzahl der Tage des Monats.
        
        // Objekt der Klasse Calendar erzeugen und mit Daten initialisieren
        Calendar cal = Calendar.getInstance();
        cal.set(year, month, 1);
        
        // Den ersten Wochentag, die Kalenderwoche und die Anzahl der Tage
        // des Monats ermitteln
        firstDay = cal.get(Calendar.DAY_OF_WEEK);
        week = cal.get(Calendar.WEEK_OF_YEAR);
        days = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        
        System.out.println("  " + mStr[month] + " " + year);
        System.out.println(" KW Mo Di Mi Do Fr Sa So");
        
        // Kalenderwoche ausgeben. Das Ganze bitte rechtsbündig.
        if (week < 10)
            System.out.print(" ");
        System.out.print(" " + week);
        
        // Im Dezember kann es passieren, dass die letzte Woche des Monat schon
        // die erste Kalenderwoche des neuen Jahres ist.
        week++;
        if (week > 50 && month == 0)
            week = 1;
        
        // Die ersten Tage sind noch aus dem Vormonat. Diese werden nicht
        // dargestellt.
        for (int i=0; i<((firstDay+5)%7); i++)
            System.out.print("   ");
        
        // Und jetzt alle Tage des Monats darstellen. 
        for (int i=1; i<=days; i++) {
            
            if (i<10)
                System.out.print(' ');
            System.out.print(" "+i);
            
            // Evtl. eine neue Zeile und damit eine neue Woche einleiten
            if ((firstDay+i+5)%7 == 0 && i<days) {
                System.out.println();

                if ((firstDay+i+5)%7 == 0) {
                    if (week<10)
                        System.out.print(' ');
                    System.out.print(" "+week);
                    week++;
                }
            }
        }
        System.out.println();
    }
}
