package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; import design.runtime.*; import design.model.*; import design.model.course_search.*; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /* * The actual SEARCH feature of course searching. */ public class CourseSearch extends Menu { CurrentSearchQuery query = CurrentSearchQuery.INSTANCE; @Override public String getTitle() { return "select course"; } /* * Prompt for input and search. */ public void search() { 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); this.present(); // reset the query after we're done. query.reset(); } /* * 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", (a) -> 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; } // 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) { menuOptions.add(new MenuOption( c.getName() + ", " + c.getLocation() + ", Difficulty: " + c.getDifficultyRating() + ", " + c.getHoleCount() + " holes, " + c.getTotalPar() + " total par", (a) -> { 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(); } currentGolfer.addCourse(c); System.out.println("\n Course added to profile. \n"); } )); } // if not, we need to traverse another courselist else if (icourse instanceof CourseList sublist) { addCoursesRecursive(menuOptions, sublist); } } } }