package demoEnum;

public enum Month {
	/* See https://www.esrl.noaa.gov/gmd/grad/neubrew/Calendar.jsp  for a DOY calendar */
	JANUARY 		(31),
	FEBRUARY		(28) {
		@Override public int numDays() { return super.numDays() + (Month.leapYear?1:0); }  },
	MARCH			(31),
	APRIL			(30),
	MAY				(31),
	JUNE				(30),
	JULY				(31),
	AUGUST		(31),
	SEPTEMBER	(30),
	OCTOBER		(31),
	NOVEMBER		(30),
	DECEMBER		(31);

	private final int days;
	private static boolean leapYear=false;

	Month(int days) { this.days=days; }

	static void setLeapYear(int year) {
		if (0==year%400) leapYear=true;
		else if (0==year%100) leapYear=false;
		else if (0==year%4) leapYear=true;
		else leapYear=false;
	}

	public String fullName() {
		String capName=name();
		return capName.substring(0,1) + capName.toLowerCase().substring(1);
	}

	public int getNumber() { return ordinal()+1; }

	public String abbrev() {
		return fullName().substring(0,3);
	}

	public int numDays() { return days; }

	public static Month monthFromDOY(int daysFromJan1) {
		int daysFrom1=daysFromJan1;
		for(Month cm : values()) {
			if (daysFrom1 <= cm.numDays()) return cm;
			daysFrom1 -= cm.numDays();
		}
		throw new IllegalArgumentException("daysFromJan1 argument to monthFromDOY is incorrect.");
	}

	public static int domFromDOY(int daysFromJan1) {
		int daysFrom1=daysFromJan1;
		for(Month cm : values()) {
			if (daysFrom1 <= cm.numDays()) return daysFrom1;
			daysFrom1 -= cm.numDays();
		}
		throw new IllegalArgumentException("daysFromJan1 argument to domFromDOY is incorrect.");
	}

	public static Month monthFromNum(int mn) {
		// for(Month cm : values()) if (cm.number==mn) return cm;
		// throw new IllegalArgumentException("mn argument to monthFromNum is incorrect");
		return values()[mn-1];
	}

	public int doyFromDOM(int dom) {
		int doy=0;
		for(Month cm : values()) {
			if (ordinal() > cm.ordinal()) doy+=cm.numDays();
		}
		return doy+dom;
	}

}