package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; import design.model.Course; import design.model.Golfer; import design.model.course_search.CourseList; import design.model.course_search.CurrentSearchQuery; import design.model.course_search.ICourse; import design.persistence.PersonalDatabase; import design.runtime.Session; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /* * The actual SEARCH feature of course searching. */ public class CourseSearch extends Menu { private final CurrentSearchQuery query = CurrentSearchQuery.INSTANCE; private final PersonalDatabase personalDB = PersonalDatabase.INSTANCE; @Override public String getTitle() { return "select course"; } /* * Display the results of our search. */ @Override public List getMenuOptions() { var l = new ArrayList(); List queryResult = query.getQueryResult().getCourses(); // 0 - return to main menu l.add(new MenuOption("return to main menu", () -> new MainMenu().present())); // if we find no results, let the user know. if (queryResult.isEmpty()) { System.out.println("\nNo matching courses found.\n"); } // traverse the course list tree and add menu options for each leaf (course) addCoursesRecursive(l, query.getQueryResult()); return l; } /* * Prompt for input and search. */ @Override public void present() { System.out.print("Enter search term (blank for all): "); Scanner sc = new Scanner(System.in); String searchTerm = sc.nextLine(); // search and present query.search(searchTerm); super.present(); // reset the query after we're done. query.reset(); } // recursively go through tree structure of courselist to make menu options. // this is all for displaying the menu options, not the actual sorting. private void addCoursesRecursive(List menuOptions, CourseList list) { for (ICourse icourse : list.getCourses()) { // if we find a leaf (course), display it as a menu option if (icourse instanceof Course c) { var name = String.format("%s, %s, Difficulty: %s, %s holes, %s total par", c.getName(), c.getLocation(), c.getDifficultyRating(), c.getHoleCount(), c.getTotalPar()); menuOptions.add(new MenuOption(name, () -> { Golfer currentGolfer = Session.getCurrentGolfer(); if (currentGolfer == null) { // if we aren't logged in, notify the user. System.out.println("\n\n !!! log into a golfer account to add courses to your profile. !!! \n\n"); new MainMenu().present(); return; } // add the course, try to save to DB. currentGolfer.addCourse(c); try { personalDB.updateGolfer(currentGolfer); } catch (IOException e) { e.printStackTrace(); // not sure if we should format this prettier for the user if the DB fails. } System.out.println("\n Course added to profile. \n"); new MainMenu().present(); } )); } // if not, we need to traverse another courselist else if (icourse instanceof CourseList sublist) { addCoursesRecursive(menuOptions, sublist); } } } }