//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Sharon Whiteman
//
//CS 302
//Chapter 3 Example: Birthday Tracker
//
//27 September 2002
//
//This is the instantiable class Birthday.
//It is used by the program BirthdayMain.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class Birthday
{
	//Data Members

	//integers to hold the month, day, and year of birth
	private int day;
	private int month;
	private int year;

	//Public Methods
	//	void setDay(int)
	//	void setMonth(int)
	//	void setYear(int)
	//	void getBirthday()

	//This is the default constructor.  
	//It sets day, month, and year to 0.
	public Birthday()
	{
		day = 0;
		month = 0;
		year = 0;
		return;
	}

        //This is another constructor.  
	//It sets the day, month, and year to the values specified by the
	//	parameters.
	public Birthday(int dayNew, int monthNew, int yearNew)
	{
	        boolean status = checkDate(dayNew, monthNew, yearNew);

		if(status)
		{
			day = dayNew;
			month = monthNew;
			year = yearNew;
		}
		return;
	}

        //This method sets the day of birth to the value specified by dayNew.
	public void setDay(int dayNew)
	{
		boolean status = checkDate(dayNew, 1, 2000);
		if(status)
		{
			day = dayNew;
		}
		return;
	}

	//This method sets the month of birth to the value specified by monthNew.
	public void setMonth(int monthNew)
	{
		boolean status = checkDate(1, monthNew, 2000);
		if(status)
		{
			month = monthNew;
		}
		return;
	}

	//This method sets the year of birth to the value specified by yearNew.
	public void setYear(int yearNew)
	{
		boolean status = checkDate(1, 1, yearNew);
		if(status)
		{
			year = yearNew;
		}
		return;
	}

	//This method prints out the birthday, in standard US form.
	public void printBirthday()
	{
		String monthStr = "";

		switch(month)
		{
			case 1: monthStr = "Jan"; break;
			case 2: monthStr = "Feb"; break;
			case 3: monthStr = "March"; break;
			case 4: monthStr = "Apr"; break;
			case 5: monthStr = "May"; break;
			case 6: monthStr = "June"; break;
			case 7: monthStr = "July"; break;
			case 8: monthStr = "Aug"; break;
			case 9: monthStr = "Sept"; break;
			case 10: monthStr = "Oct"; break;
			case 11: monthStr = "Nov"; break;
			case 12: monthStr = "Dec"; break;
			default: monthStr = "INVALID";
		}
		System.out.println("Birthday is: " + monthStr + " " 
			+ day + ", " + year);
		return;
	}
	private boolean checkDate(int dayNew, int monthNew, int yearNew)
	{
		if(yearNew <= 0)
		{
			System.out.println("Invalid year."
			  + "Setting all values to 0.");
			day = 0;
			month = 0;
			year = 0;
			return false;
		}
		else if(monthNew > 0 && monthNew < 13)
		{
			if(monthNew == 1 || monthNew == 3 || 
			   monthNew == 5 || monthNew == 7 ||
			   monthNew == 8 || monthNew == 10 ||
			   monthNew == 12)
			{
				if(dayNew < 1 || dayNew > 31)
				{
					System.out.println("Invalid day."
					  + "Setting all values to 0.");
					day = 0;
					month = 0;
					year = 0;
					return false;
				}
				else
				{
					return true;
				}
			}
			else if (monthNew == 4 || monthNew == 6 ||
				 monthNew == 9 || monthNew == 11)
			{
				if(dayNew < 1 || dayNew > 30)
				{
					System.out.println("Invalid day."
					  + "Setting all values to 0");
				        day = 0;
				        month = 0;
				        year = 0;
				        return false;
			  	}
				else
				{
					return true;
				}
			}
			else if(monthNew == 2)
			{
				if(yearNew % 400 == 0)
				{
					if(dayNew < 1 || dayNew > 29)
					{
						System.out.println("Invalid day."
						  + "Setting all values to 0");
						day = 0;
						month = 0;
						year = 0;
						return false;
					}
					else
					{
						return true;
					}
				}
				else if(yearNew % 4 == 0 && yearNew % 100 != 0)
				{
					if(dayNew < 1 || dayNew > 29)
					{
						System.out.println("Invalid day."
						  + "Setting all values to 0");
						day = 0;
						month = 0;
						year = 0;
						return false;
					}
					else
					{
						return true;
					}
				}
				else
				{
					if(dayNew < 1 || dayNew > 28)
					{
						System.out.println("Invalid day."
						  + "Setting all values to 0");
						day = 0;
						month = 0;
						year = 0;
						return false;
					}
					else
					{
						return true;
					}
				}
			}
			else
			{
				System.out.println("Invalid month."  
				  + "Setting all values to 0.");
				day = 0;
				month = 0;
				year = 0;
				return false;
			}
		}
		return false;
	}




	
}
    


