
/** 
 *	Author: Gurkirat Singh  
 *	Date: Nov 27,2018
 *  Course: CST8130
 *  Purpose: This program is used to add Events into an ArrayList. 
 *  		 The events can be entered manually by providing information according to the type of the event or can be read from a file already made. 
 *  		 The program gives the option to display the events by date or by week according to the date provided. 
 *  		 Events can also be deleted by providing the type, date and time of occurence. 
 *  		 The user also get option to display all the events. 
 *  		 Also, there is a option to exit the program.
 *  		 
 *	Data fields:
 *	
 *	Methods: default constructor
 *			 sort: void - Sort the date and time
 *			 closefile: void - Close the scanner when done.
 *			  	 	
 * 
 */
import java.io.File; 
import java.io.IOException;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.NoSuchElementException;
import java.util.Scanner;

public class Assign1 {
	public static Scanner in = new Scanner(System.in);
	public static Scanner input = new Scanner(System.in);

	static ArrayList<Events> events = new ArrayList<Events>();

	public Assign1() {

	}

	public static void sort() {
		Events temp;
		OurDate date1, date2;
		OurTime time1, time2;

		// first: sort by date
		for (int i = 1; i < events.size(); i++) {
			for (int j = i; j > 0; j--) {
				date1 = events.get(j - 1).getDate();
				date2 = events.get(j).getDate();

				if (date1.isGreater(date2)) {
					temp = events.get(j);
					events.set(j, events.get(j - 1));
					events.set(j - 1, temp);
				}
			}
		}

		// second: sort by time
		for (int i = 1; i < events.size(); i++) {
			for (int j = i; j > 0; j--) {
				date1 = events.get(j - 1).getDate();
				date2 = events.get(j).getDate();
				time1 = events.get(j - 1).getTime();
				time2 = events.get(j).getTime();
				if (time1.isGreater(time2) && date1.isEqual(date2)) {
					temp = events.get(j);
					events.set(j, events.get(j - 1));
					events.set(j - 1, temp);
				}
			}
		}
	}

	public static void closeFile() {

		if (input != null)
			input.close();
	}

	public static void main(String[] args) throws IOException {
		int count = 0;
		int menu_opt = 0;
		int type = 0;
		int userinput = 0;
		boolean quit = false;
		do {
			try {

				System.out.println("\n" + "1 ... Add an event from keyboard\n" + "2 ... Display events of day\n"
						+ "3 ... Display events of a week\n" + "4 ... Delete an event\n"
						+ "5 ... Add events from file\n" + "6 ... Display all events\n" + "7 ... Quit\n");

				menu_opt = in.nextInt();

				switch (menu_opt) {

				case 1:
					boolean duplicate = false;
					boolean valid = false;
					OurDate dateIn = new OurDate();
					OurTime timeIn = new OurTime();
					while (!valid) {
						System.out.println("1 ... Meeting Event\n" + "2 ... School Event\n" + "3 ... Work Event\n"
								+ "4 ... Gym Event \n" + "5 ... Social Event");
						type = in.nextInt();
						if (type < 1 || type > 4) {
							System.out.println("Invalid type....  please reenter the type");

						} else
							valid = true;

					}
					dateIn.readDate(in, 'k');
					timeIn.readTime(in, 'k');
					if (type == 1) {

						Meeting meeting = new Meeting(dateIn, timeIn);

						for (int i = 0; i <= events.size() - 1; i++) {
							if (dateIn.isEqual(events.get(i).getDate()) && timeIn.isEqual(events.get(i).getTime())) {
								duplicate = true;
							}
						}
						if (!duplicate) {
							events.add(meeting);

						}

					} else if (type == 2 || type == 4 || type == 5) {

						MoreEvents moreevents = new MoreEvents(dateIn, timeIn);

						for (int i = 0; i <= events.size() - 1; i++) {
							if (dateIn.isEqual(events.get(i).getDate()) && timeIn.isEqual(events.get(i).getTime())) {
								duplicate = true;
							}
						}
						if (!duplicate) {
							events.add(moreevents);

						}

					} else if (type == 3) {
						Work work = new Work(dateIn, timeIn);

						for (int i = 0; i <= events.size() - 1; i++) {
							if (dateIn.isEqual(events.get(i).getDate()) && timeIn.isEqual(events.get(i).getTime())) {
								duplicate = true;
							}
						}
						if (!duplicate) {
							events.add(work);

						}
						work.workplace();
						work.hours();

					}
					if (duplicate) {
						System.out.println("Cannot add to planner, Event already exist at that time.");

					} else {
						System.out.println("Event is added to array.");
						userinput++;
					}

					break;

				case 2:
					int countevents = 0;
					if (count > 0 || userinput > 0) {
						OurDate findDate = new OurDate();
						findDate.readDate(in, 'k');
						System.out.println("Your events on " + findDate.getYear() + "/" + findDate.getMonth() + "/"
								+ findDate.getDay() + " are:");
						for (int i = 0; i <= events.size() - 1; i++) {
							if (findDate.isEqual(events.get(i).getDate())) {

								System.out.println("\t" + events.get(i).toString());
								countevents++;

							}
						}
						if (countevents == 0) {
							System.out.println("\t" + "No Events");
						}
					} else
						System.out.println(
								"Nothing to Display:- Add events using keyboard or from file before proceeding to this option");
					break;

				case 3:
					if (count > 0 || userinput > 0) {
						int weekevents = 0;
						OurDate wdate1 = new OurDate();
						wdate1.readDate(in, 'k');

						OurDate wdate2 = new OurDate(wdate1);

						for (int i = 0; i < 6; i++) {
							wdate2.addOne();

						}
						sort();

						System.out.println("Your activities for the week starting from " + wdate1.toString() + " until "
								+ wdate2.toString() + " are:");
						for (int i = 0; i < events.size(); i++) {
							if ((wdate2.isGreater(events.get(i).getDate()) || wdate2.isEqual(events.get(i).getDate()))
									&& (events.get(i).getDate().isGreater(wdate1)
											|| events.get(i).getDate().isEqual(wdate1))) {
								System.out.println("\t" + events.get(i).toString());
								weekevents++;
							}
						}
						if (weekevents == 0) {

							System.out.println("No Events found");
						}
					} else
						System.out.println(
								"Nothing to Display:- Add events using keyboard or from file before proceeding to this option");

					break;

				case 4:
					if (count > 0 || userinput > 0) {

						OurDate delDate = new OurDate();
						OurTime delTime = new OurTime();

						System.out.println("Enter the type, date and time of the event to be deleted\n"
								+ "Enter type(1 – Meeting, 2 – School, 3 – Work, 4 – Gym, 5 - Social");
						int deltype = in.nextInt();
						int i;
						delDate.readDate(in, 'k');
						delTime.readTime(in, 'k');
						boolean booleanFoundEvent = false;
						for (i = 0; i <= events.size() - 1; i++) {
							if (delDate.isEqual(events.get(i).getDate()) && delTime.isEqual(events.get(i).getTime())) {
								booleanFoundEvent = true;
								break;
							}
						}
						if (booleanFoundEvent) {
							events.remove(i);
							System.out.println("Activity deleted. That date and time slot is now free.");
						} else {
							System.out.println("There is no activity for that date and time!");
						}
					} else
						System.out.println(
								"Nothing to Delete:- Add events using keyboard or from file before proceeding to this option.");

					break;

				case 5:
					int file_type, file_month, file_day, file_year, file_hour, file_min, work_hour = 0;
					String file_description, location;

					if (count == 0) {
						try {
							File file = new File("/Users/gurkiratsingh/Desktop/Assign1_materials/Events.txt");
							// File file=new File(scanner.next());
							if (file.exists()) {
								input = new Scanner(file);

								while (input.hasNext()) {

									file_type = input.nextInt();
									file_day = input.nextInt();
									file_month = input.nextInt();
									file_year = input.nextInt();
									file_hour = input.nextInt();
									file_min = input.nextInt();
									file_description = input.next();
									location = "";

									if (file_type == 1 || file_type == 3) {
										location = input.next();
									}
									if (file_type == 3) {
										work_hour = input.nextInt();
									}

									if (file_type == 1) {
										events.add(new Meeting(file_day, file_month, file_year, file_hour, file_min,
												file_description, location));

									} else if (file_type == 3) {

										events.add(new Work(file_day, file_month, file_year, file_hour, file_min,
												file_description, location, work_hour));

									} else {
										events.add(new MoreEvents(file_day, file_month, file_year, file_hour, file_min,
												file_description));

									}

								}
								System.out.println("File added");
							} else
								System.err.println("File doesnot exist");

						}

						catch (NoSuchElementException elementException) {
							System.err.println("Error: File improperly formed.");

						} catch (IllegalStateException stateException) {
							System.err.println("Error reading from file. Terminating.");
						}
						closeFile();
						System.out.println();
						count++;
					} else
						System.out.println("File Already Added. Please select another options.");

					break;
				case 6:
					sort();

					System.out.println("LIST OF EVENTS\n**************");
					for (int x = 0; x < events.size(); x++) {
						System.out.println("\t" + events.get(x).toString());
					}
					if (events.size() == 0) {
						System.out.println("Nothing to Display");
					}

					break;

				case 7:
					System.out.println("Good bye... Have a nice day");

					quit = true;
					break;

				default:
					System.out.println("Invalid entry....  please enter the correct choice");

				}

			} catch (InputMismatchException inputMismatchException) {
				System.out.println("Invalid entry....  please enter the correct choice");
				in.next();

			}
		} while (!quit);

	}
}
