class Driver {

 public static void main(String args[]) {

  Member facebookmembers[] = new Member[1];
  int tempselect, temparraylength, tempselect2;
  String tempcategory, tempname;
  Interest tempinterest[] = new Interest[1];
  char menu;


  System.out.println("Andrew Melnyk");
  System.out.println("Section 8228");
  System.out.println("NO group");
  System.out.println("No partner");

  System.out.println("\n\n\n\n\n\n\n\n");
  
  System.out.println("********Welcome to Facebook********");
  System.out.println("********Please set up Facebook now.....********");
  System.out.print("How many members are there in Facebook now: ");
  temparraylength = UserInput.readInt();
  
  facebookmembers = new Member[temparraylength];
  facebookmembers = setUpFacebook(facebookmembers);
  
  System.out.println("Thanks for setting up facebook!");
  
   for(menu = 's';!( menu == 'q');) {
    System.out.println("\n\n\nThe Menu:");
    System.out.println("a - Add Member");
    System.out.println("b - remove Member");
    System.out.println("c - compare member's name");
    System.out.println("d - compare member's date of birth");
    System.out.println("e - compare member's interests");
    System.out.println("f - list all members in database with information");
    System.out.println("Any other key - Exit");
    System.out.print("Enter your selection: ");
    menu = UserInput.readChar();


    switch(menu) {
    case('A'):
    case('a'): facebookmembers = addMemberToList(facebookmembers);
               break;

    case('B'):
    case('b'): printOutList(facebookmembers, true);
               System.out.print("Which member do you wish to remove? Enter the number: ");
               tempselect = UserInput.readInt() - 1;
               facebookmembers = removeMemberFromList(facebookmembers, tempselect);
               break;

    case('C'):
    case('c'): printOutList(facebookmembers, true);
               System.out.print("First member to compare? Enter the number: ");
               tempselect = UserInput.readInt() - 1;
               System.out.print("Second member to compare? Enter the number: ");
               tempselect2 = UserInput.readInt() - 1;
               System.out.println("The name comparison reads " + facebookmembers[tempselect].compareTo(facebookmembers[tempselect2]) + "\n\n");
               break;

    case('D'):
    case('d'): printOutList(facebookmembers, true);
               System.out.print("First member to compare? Enter the number: ");
               tempselect = UserInput.readInt() - 1;
               System.out.print("Second member to compare? Enter the number: ");
               tempselect2 = UserInput.readInt() - 1;
               System.out.println("\nThe date of birth comparison reads " + MemberDateOfBirthComparator.compare(facebookmembers[tempselect].getDateOfBirth(), facebookmembers[tempselect2].getDateOfBirth()) + "\n\n");
               break;

    case('E'):
    case('e'): printOutList(facebookmembers, true);
               System.out.print("First Member to Compare? Enter the number: ");
               tempselect = UserInput.readInt() - 1;
               System.out.print("Second Member to Compare? Enter the number: ");
               tempselect2 = UserInput.readInt() - 1;
               System.out.println("The Interest comparison reads " + MemberInterestComparator.compare(facebookmembers[tempselect].getInterest(), facebookmembers[tempselect2].getInterest()) + "\n\n");
               break;

    case('F'):
    case('f'): printOutList(facebookmembers, false);
               System.out.println("\n");
               break;
    default: menu = 'q';

    }

  }

 }

 public static Member[] setUpFacebook(Member tempMembers[]) {

  int tempday, tempmonth, tempyear, tempselect, temparraylength, templevel, i, j;
  String tempcategory, tempname;
  Interest  trueinterest[];
  char yeanay;

  for(i = 0; i < tempMembers.length; i++) {
   System.out.println("Please enter the following Information for member " + (i + 1) + ": ");
   System.out.print("Member's Name: ");
   tempname = UserInput.readString();

   System.out.print("Members Date of birth (Use only numbers, 1 for Jan - 12 for December) \n Starting with day: ");
   tempday = UserInput.readInt();

   System.out.print("Month: ");
   tempmonth = UserInput.readInt();

   System.out.print("Year: ");
   tempyear = UserInput.readInt();
   
     
    j = 0;
    System.out.print("How many interests do you have? (10 diff types): ");
    temparraylength = UserInput.readInt();
    trueinterest = new Interest[temparraylength];

    for(int k = 0; k < trueinterest.length; k++) {
     System.out.println("Please select at least 1 interest from the list (by entering the Number): ");
     System.out.print("1 - Politics ***** 2 - Religion ***** 3 - Cooking ***** 4 - Sports \n5 - Animals");
     System.out.println(" ***** 6 - Video games ***** 7 - Movies ***** 8 - Sleep");
     System.out.println("9 - Drawing ***** 10 - Computers");
     System.out.print("Enter the number here: ");
     tempselect = UserInput.readInt();
      switch(tempselect) {
       case(1): tempcategory = "Politics";
                break;
       case(2)
: tempcategory = "Religion";
                break;
       case(3): tempcategory = "Cooking";
                break;
       case(4): tempcategory = "Sports";
                break;
       case(5): tempcategory = "Animals";
                break;
       case(6): tempcategory = "Video Games";
                break;
       case(7): tempcategory = "Movies";
                break;
       case(8): tempcategory = "Sleep";
                break;
       case(9): tempcategory = "Drawing";
                break;
       case(10): tempcategory = "Computers";
                 break;
       default: System.out.println("Defaulting to interest Facebook...");
                tempcategory = "Facebook";
      }

     System.out.println();
     System.out.print("What is the level of that interest (1 being lowest, 5 being highest): ");
     templevel = UserInput.readInt();

     if(templevel < 1) {
     templevel = 1;
     }     
     else if(templevel > 5) {
     templevel = 5;
     }
     
     trueinterest[j] = new Interest(new Category(tempcategory), templevel);
     j++;
    
// System.out.print(trueinterest[j-1].toString());
    
   }

   tempMembers[i] = new Member(tempname, new DateOfBirth(tempday, tempmonth, tempyear), trueinterest);
   System.out.println("\n");
  }

  return tempMembers;


 }

 public static Member[] addMemberToList(Member listing[]) {


  int tempday, tempmonth, tempyear, tempselect, temparraylength, templevel, i, j;
  String tempcategory, tempname;
  Interest  trueinterest[] = new Interest[11];
  char yeanay;


  Member templist[] = new Member[listing.length + 1];
  for(i = 0; i < listing.length; i++) {
  templist[i] = listing[i];
  }

    System.out.println("Please enter the following Information for member " + (i + 1) + ": ");
   System.out.print("Member's Name: ");
   tempname = UserInput.readString();

   System.out.print("Members Date of birth (Use only numbers, 1 for Jan - 12 for December), starting with day: ");
   tempday = UserInput.readInt();

   System.out.print("Month: ");
   tempmonth = UserInput.readInt();

   System.out.print("Year: ");
   tempyear = UserInput.readInt();
   
     
    j = 0;
    System.out.print("How many interests do you have? (10 diff types): ");
    temparraylength = UserInput.readInt();
    trueinterest = new Interest[temparraylength];

    for(int k = 0; k < trueinterest.length; k++) {
     System.out.println("Please select at least 1 interest from the list (by entering the Number): ");
     System.out.print("1 - Politics ***** 2 - Religion ***** 3 - Cooking ***** 4 - Sports \n  5 - Animals");
     System.out.println(" ***** 6 - Video games ***** 7 - Movies ***** 8 - Sleep");
     System.out.println("9 - Drawing ***** 10 - Computers");
     System.out.print("Enter the number here: ");
     tempselect = UserInput.readInt();
      switch(tempselect) {
       case(1): tempcategory = "Politics";
                break;
       case(2): tempcategory = "Religion";
                break;
       case(3): tempcategory = "Cooking";
                break;
       case(4): tempcategory = "Sports";
                break;
       case(5): tempcategory = "Animals";
                break;
       case(6): tempcategory = "Video Games";
                break;
       case(7): tempcategory = "Movies";
                break;
       case(8): tempcategory = "Sleep";
                break;
       case(9): tempcategory = "Drawing";
                break;
       case(10): tempcategory = "Computers";
                 break;
       default: System.out.println("Defaulting to interest Facebook...");
                tempcategory = "Facebook";
      }


     System.out.println("What is the level of that interest (1 being lowest, 5 being highest): ");
     templevel = UserInput.readInt();

     if(templevel < 1) {
     templevel = 1;
     }     
     else if(templevel > 5) {
     templevel = 5;
     }
     
     trueinterest[j] = new Interest(new Category(tempcategory), templevel);
     j++;
    
// System.out.print(trueinterest[j-1].toString());
    
   }

   templist[templist.length - 1] = new Member(tempname, new DateOfBirth(tempday, tempmonth, tempyear), trueinterest);
   
   return templist;

 }

 public static Member[] removeMemberFromList(Member listing[], int location) {

  Member templist[] = new Member[listing.length - 1];
  int i, j = 0;
   for(i = 0; i < listing.length; i++) {
    if(i == location) { 
    }
    else {
    templist[j] = listing[i];
    j++;
    }

   }


  return templist;
 }

 public static void printOutList(Member list[], boolean namesonly) {
  int i = 0;
  if(namesonly == false) {
   for(i = 0; i < list.length; i++) {
    System.out.println("Member number " + (i + 1) + ": " + list[i].toString() + "\n");
   }
  }
  else{
   for(i = 0; i < list.length; i++) {
    System.out.println("Member number " + (i + 1) + ": " + list[i].getName() + "\n");
   }
  }

 }

}


class Member implements Cloneable, Comparable {
  private String name;
  private DateOfBirth dateOfBirth;
  private Interest interest[] = new Interest[1];


  public Member() {
   this.name = "A";
   this.dateOfBirth = new DateOfBirth();
   this.interest[0] = new Interest(new Category("Politics"), 1);
  }

  public Member(String joe, DateOfBirth awesome, Interest interest[]) {
   this.name = joe;
   this.dateOfBirth = awesome;
   this.interest = interest;
  }

  public Member clone() {
   Member memclone = new Member(this.name,  this.getDateOfBirth(), this.interest); 
   return memclone;
  }

  public int compareTo(Object object) {
   Member comparethis = new Member();
   int value;

   if(object instanceof Member) {
    comparethis = (Member) object;
   }
   else {
    IncompatibleTypesException exception = new IncompatibleTypesException("Not a member to member comparison!");
   }
   
   value = comparethis.name.compareToIgnoreCase(this.name);

   if(value > 1) {
    value = 1;
   }
   else if(value < -1) {
    value = -1;
   } 

   return value;
  }

  public String getName() {
   return this.name;
  }

  public DateOfBirth getDateOfBirth() {
   return this.dateOfBirth;
  }

  public Interest[] getInterest() {
   return this.interest;
  }

  public void setName(String joe) {
   this.name = joe;
  }

  public void setDateOfBirth(DateOfBirth dob) {
   this.dateOfBirth = dob;
  }

  public void setInterest(Interest category[]) {
   this.interest = category;
  }

  public String toString() {
   String intereststring = "\n";
   int i;
    for(i = 0; i < this.interest.length ; i++) { 
     intereststring = intereststring.concat(this.interest[i].toString());     
   }

   return "Name is " + this.name + "\n" + this.dateOfBirth.toString() + intereststring;
  }

}

class DateOfBirth implements Cloneable, Comparable {
 private int day;
 private int month;
 private int year;

 public DateOfBirth() {
  this.day = 1;
  this.month = 1;
  this.year = 2007;
 }

 public DateOfBirth(int day, int month, int year) {
  this.day = day;
  this.month = month;
  this.year = year;
 }

 public int compareTo(Object object) {
  DateOfBirth comparethis = (DateOfBirth) object;

  if(object instanceof DateOfBirth) { 
   System.out.println(comparethis.toString());

   if(this.year == comparethis.year) {
    if(this.month == comparethis.month) {
     if(this.day == comparethis.day) {
      return 0;
     }
     else if(this.day < comparethis.day) {
      return 1;
     }
     else {
      return -1;
     }
    }
    else if(this.month < comparethis.month) {
     return 1;
    }
    else {
     return -1;
    }

   }
   else if(this.year < comparethis.year) {
    return 1;
   }
   else {
    return -1;
   }

  }
  else {
 IncompatibleTypesException exception = new IncompatibleTypesException("Date of Birth needed to compare to Date of Birth");   
  }

  return -2;
 }

 public void setDay(int day) {
  this.day = day;
 }

 public void setMonth(int month) {
  this.month = month;
 }

 public void setYear(int year) {
  this.year = year;
 }

 public int getDay() {
  return this.day;
 }

 public int getMonth() {
  return this.month;
 }

 public int getYear() {
  return this.year;
 }

 public String toString() {
  return "Date of birth was (Day/Month/Year) - " + day + " / " + month + " / " + year;
 }

 public Object clone() {
  DateOfBirth copy = new DateOfBirth(this.day, this.month, this.year);
  return copy;
 }

}

class Interest implements Cloneable, Comparable {
 private Category category;
 private int level;

 public Interest() {
  this.category = new Category();
  this.level = 1;
 }

 public Interest(Category type, int level) {
  this.category = type;
  this.level = level;
 }

 public int compareTo(Object object) {
  int value;
  Interest compare;

  String first, second;

  compare = (Interest) object;

  first = this.category.getDescription();
  second = compare.category.getDescription();

  value = second.compareToIgnoreCase(first);

  if(value > 1) {
  value = 1;
  }
  else if(value < -1) {
  value = -1;
  }

  return value;

 }

 public void setCategory(Category type) {
  this.category = type;
 }

 public void setLevel(int level) {
  this.level = level;
 }

 public Category getCategory() {
  return this.category;
 }

 public int getLevel() {
  return this.level;
 }

 public String toString() {
  return category.toString() + " and it is recorded at a level of " + level + "\n";
 }

 public Object clone() {
  Interest interestClone = new Interest(this.getCategory(), this.level);
  return interestClone;
 }

}

class Category implements Cloneable {
 private String description;

 public Category() {
  this.description = "Politics";
 }

 public Category(String type) {
  this.description = type;
 }

 public String getDescription() {
  return this.description;
 }

 public void setDescription(String type) {
  this.description = type;
 }

 public String toString() {
  return "has the interest of " + description;
 }


 public Object clone() { 
  Category catClone = new Category(this.description);
  return catClone;
 }

}

class MemberDateOfBirthComparator {

 public static int compare(Object object1, Object object2) {
  DateOfBirth dob1, dob2;

  if(!((object1 instanceof DateOfBirth) && (object2 instanceof DateOfBirth))) {
  IncompatibleTypesException exception = new IncompatibleTypesException("Date Of Birth objects are required to compare, types do not match");
  }
  else {
  
  dob1 = (DateOfBirth) object1;
  dob2 = (DateOfBirth) object2;

  return dob1.compareTo(dob2);

  }
  return 1;
 }

}

class MemberInterestComparator {

 public static int compare(Object object1[], Object object2[]) {
  Interest i1[], i2[];
  int returned = 1;

  if(!((object1 instanceof Interest[]) && (object2 instanceof Interest[]))) {
  IncompatibleTypesException exception = new IncompatibleTypesException("Interest objects are required to compare, types do not match");
  }
  else {
  
  i1 = (Interest[]) object1;
  i2 = (Interest[]) object2;

  for(int i = 0; i < i1.length; i++) {   
   if(i == i2.length) {
    returned = 1;
    break;
   }

   returned = i1[i].compareTo(i2[i]);
   if(returned == 1) {
    break;
   }
   else if(returned == -1) {
    break;
   }
   else if((returned == 0)) {
    if(i == i1.length - 1) {
     System.out.println(i1.length);
     System.out.println(i2.length);
     if(i1.length == i2.length) {
     break;
     }
     else {
     returned = -1;
     }
    }
   }
  }
  
  }
  return returned;
 }

}

class IncompatibleTypesException extends RuntimeException {
 int idk = 1;

 public IncompatibleTypesException() {
  super();
  }

 public IncompatibleTypesException(String message) {
  super(message);
  }

 public String getMessage() {
  return super.getMessage();
  }

}