// http://www.idevelopment.info/data/Programming/java/date/CalendarExample.java
// http://introcs.cs.princeton.edu/java/21function/Calendar.java.html
// http://caterpillar.onlyfun.net/Gossip/index.html
// http://caterpillar.onlyfun.net/Gossip/JavaGossip-V2/JavaGossip2.htm
import java.util.Calendar;
import java.util.Scanner;

public class EX05_Cal {
	String[] list = new String[8];
	final static String eWeek = " Sun Mon Tue Wed Thu Fri Sat";
	final static String cWeek = "  日  一  二  三  四  五  六";
	final static String[] eMon = { "", "January", "February", "March", "April",
			"May", "June", "July", "August", "September", "October",
			"November", "December" };

	final static String[] cMon = { "", "一月", "二月", "三月", "四月", "五月", "六月",
			"七月", "八月", "九月", "十月", "十一月", "十二月" };

	/** Main method */
	public static void main(String[] args) {
		EX05_Cal mycal = new EX05_Cal();

		Scanner input = new Scanner(System.in);
		Calendar cal = Calendar.getInstance();

		int year = cal.get(Calendar.YEAR);

		int month = cal.get(Calendar.MONTH) + 1;
		boolean bWest = false;
		
		if(args[0].equals("-eng")) {
			bWest = true;
		}

		// Print calendar for the month of the year
		printMonth(year, month, true);
	}

	/** Print the calendar for a month in a year */
	public static void printMonth(int year, int month, boolean bWest) {
		// Print the headings of the calendar
		printMonthTitle(year, month, bWest);

		// Print the body of the calendar
		printMonthBody(year, month);
	}

	/** Print the month title, e.g., May, 1999 */
	public static void printMonthTitle(int year, int month, boolean bWest) {
		if (bWest) {
			System.out.println("         " + getMonthName(month, bWest) + " "
					+ year);
			System.out.println(eWeek);

		} else {
			System.out.println("     民國 " + (year - 1911) + " 年 "
					+ getMonthName(month, bWest));
			System.out.println(cWeek);

		}
	}

	/** Get the English name for the month */
	public static String getMonthName(int month, boolean bWest) {
		return bWest ? eMon[month] : cMon[month];
	}

	/** Print month body */
	public static void printMonthBody(int year, int month) {
		// Get start day of the week for the first date in the month
		int startDay = getStartDay(year, month);

		// Get number of days in the month
		int numberOfDaysInMonth = getNumberOfDaysInMonth(year, month);

		// Pad space before the first day of the month
		int i = 0;
		for (i = 0; i < startDay; i++)
			System.out.print("    ");

		for (i = 1; i <= numberOfDaysInMonth; i++) {
			System.out.printf("%4d", i);

			if ((i + startDay) % 7 == 0)
				System.out.println();
		}

		System.out.println();
	}

	/** Get the start day of month/1/year */
	public static int getStartDay(int year, int month) {
		final int START_DAY_FOR_JAN_1_1800 = 3;
		// Get total number of days from 1/1/1800 to month/1/year
		int totalNumberOfDays = getTotalNumberOfDays(year, month);

		// Return the start day for month/1/year
		return (totalNumberOfDays + START_DAY_FOR_JAN_1_1800) % 7;
	}

	/** Get the total number of days since January 1, 1800 */
	public static int getTotalNumberOfDays(int year, int month) {
		int total = 0;

		// Get the total days from 1800 to 1/1/year
		for (int i = 1800; i < year; i++)
			if (isLeapYear(i))
				total = total + 366;
			else
				total = total + 365;

		// Add days from Jan to the month prior to the calendar month
		for (int i = 1; i < month; i++)
			total = total + getNumberOfDaysInMonth(year, i);

		return total;
	}

	/** Get the number of days in a month */
	public static int getNumberOfDaysInMonth(int year, int month) {
		if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8
				|| month == 10 || month == 12)
			return 31;

		if (month == 4 || month == 6 || month == 9 || month == 11)
			return 30;

		if (month == 2)
			return isLeapYear(year) ? 29 : 28;

		return 0; // If month is incorrect
	}

	/** Determine if it is a leap year */
	public static boolean isLeapYear(int year) {
		return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
	}
}
