summaryrefslogtreecommitdiff
path: root/src/main/java/design/controller
diff options
context:
space:
mode:
authorJacob Shimp <jrs9538@g.rit.edu>2025-10-08 19:31:45 -0400
committerJacob Shimp <jrs9538@g.rit.edu>2025-10-08 19:31:45 -0400
commit4a720e851d188688571e2f5c7f46b6389e9a429f (patch)
tree8516b582587b245226f2db1603ad2ca0fd694cf2 /src/main/java/design/controller
parent030786488b2956b7da6b0a7fd460923d7b13a25f (diff)
parentbf6b01e5005618e6ccdfb4217311a8f94dd5a0dd (diff)
downloaddesignproject-design-6-4a720e851d188688571e2f5c7f46b6389e9a429f.tar.gz
designproject-design-6-4a720e851d188688571e2f5c7f46b6389e9a429f.tar.bz2
designproject-design-6-4a720e851d188688571e2f5c7f46b6389e9a429f.zip
pull from main
Diffstat (limited to '')
-rw-r--r--src/main/java/design/controller/userinput/Action.java2
-rw-r--r--src/main/java/design/controller/userinput/Menu.java3
-rw-r--r--src/main/java/design/controller/userinput/MenuOption.java4
-rw-r--r--src/main/java/design/controller/userinput/menus/AddClubMenu.java77
-rw-r--r--src/main/java/design/controller/userinput/menus/CourseSelectMenu.java76
-rw-r--r--src/main/java/design/controller/userinput/menus/HolePlayMenu.java37
-rw-r--r--src/main/java/design/controller/userinput/menus/SelectUser.java46
-rw-r--r--src/main/java/design/controller/userinput/menus/UserSettings.java57
8 files changed, 261 insertions, 41 deletions
diff --git a/src/main/java/design/controller/userinput/Action.java b/src/main/java/design/controller/userinput/Action.java
index bb16585..2c95b2b 100644
--- a/src/main/java/design/controller/userinput/Action.java
+++ b/src/main/java/design/controller/userinput/Action.java
@@ -2,5 +2,5 @@ package design.controller.userinput;
@FunctionalInterface
public interface Action {
- void onCommand();
+ void onAction();
}
diff --git a/src/main/java/design/controller/userinput/Menu.java b/src/main/java/design/controller/userinput/Menu.java
index 8eac5dd..0b2fb26 100644
--- a/src/main/java/design/controller/userinput/Menu.java
+++ b/src/main/java/design/controller/userinput/Menu.java
@@ -9,6 +9,7 @@ public abstract class Menu {
public void present() {
var menuOptions = getMenuOptions();
+ System.out.println();
System.out.printf("-- %s --\n", getTitle().toUpperCase());
for (int i = 0; i < menuOptions.size(); i++) {
MenuOption menuOption = menuOptions.get(i);
@@ -21,7 +22,7 @@ public abstract class Menu {
try {
int i = Integer.parseInt(line);
- menuOptions.get(i).onCommand();
+ menuOptions.get(i).onAction();
} catch (ArrayIndexOutOfBoundsException ex) {
System.err.printf("Invalid option \"%s\"\n", line);
present();
diff --git a/src/main/java/design/controller/userinput/MenuOption.java b/src/main/java/design/controller/userinput/MenuOption.java
index 5ae9521..f5707a9 100644
--- a/src/main/java/design/controller/userinput/MenuOption.java
+++ b/src/main/java/design/controller/userinput/MenuOption.java
@@ -13,7 +13,7 @@ public class MenuOption {
return name;
}
- public void onCommand() {
- action.onCommand();
+ public void onAction() {
+ action.onAction();
}
}
diff --git a/src/main/java/design/controller/userinput/menus/AddClubMenu.java b/src/main/java/design/controller/userinput/menus/AddClubMenu.java
new file mode 100644
index 0000000..ea18ed5
--- /dev/null
+++ b/src/main/java/design/controller/userinput/menus/AddClubMenu.java
@@ -0,0 +1,77 @@
+package design.controller.userinput.menus;
+
+import design.controller.userinput.Menu;
+import design.controller.userinput.MenuOption;
+import design.model.Club;
+import design.model.Golfer;
+import design.persistence.PersonalDatabase;
+import design.runtime.Session;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+
+public class AddClubMenu extends Menu {
+
+ @Override
+ public String getTitle() {
+ return "add a club";
+ }
+
+ @Override
+ public List<MenuOption> getMenuOptions() {
+ List<MenuOption> opts = new ArrayList<>();
+
+ opts.add(new MenuOption("create new club", () -> {
+ Golfer g = Session.getCurrentGolfer();
+ if (g == null) {
+ System.out.println("No user loaded.");
+ new UserSettings().present();
+ return;
+ }
+
+ Scanner sc = new Scanner(System.in);
+
+ System.out.print("Manufacturer: ");
+ String manufacture = sc.nextLine().trim();
+
+ System.out.print("Nickname: ");
+ String nickname = sc.nextLine().trim();
+
+ // Pick type
+ Club.ClubType[] types = Club.ClubType.values();
+ System.out.println("Club type:");
+ for (int i = 0; i < types.length; i++) {
+ System.out.printf("%d: %s%n", i + 1, types[i]);
+ }
+
+ Club.ClubType type = null;
+ while (type == null) {
+ System.out.print("Select (1.." + types.length + "): ");
+ String line = sc.nextLine().trim();
+ int idx = Integer.parseInt(line);
+ if (idx < 1 || idx > types.length) {
+ System.out.println("Out of range. Try again.");
+ continue;
+ }
+ type = types[idx - 1];
+ }
+
+ g.addClub(manufacture, nickname, type);
+
+ // Add club to JSON
+ try {
+ PersonalDatabase.INSTANCE.updateGolfer(g);
+ System.out.println("Club added and saved.");
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to save club", e);
+ }
+ new UserSettings().present();
+ }));
+
+ opts.add(new MenuOption("cancel", () -> new UserSettings().present()));
+ return opts;
+ }
+}
diff --git a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java
index 8df9823..af825e0 100644
--- a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java
+++ b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java
@@ -28,25 +28,73 @@ public class CourseSelectMenu extends Menu {
// 0) back
opts.add(new MenuOption("back to main menu", () -> new MainMenu().present()));
- // 1) pick course by number TODO: add error checking
- opts.add(new MenuOption("pick course by number (1..1000)", () -> {
- Scanner sc = new Scanner(System.in);
-
- System.out.print("Course number (1..1000): ");
- int n = Integer.parseInt(sc.nextLine().trim());
- Course c = MasterDatabase.INSTANCE.getCourse(n - 1);
+ // 1) go to CourseSearchMenu to search for a course and add it profile
+ opts.add(new MenuOption("Add Course to Profile", () -> new MainMenu().present()));
- System.out.print("Starting hole (1..18, blank=1): ");
- String s = sc.nextLine().trim();
- int start = s.isEmpty() ? 1 : Integer.parseInt(s);
+ // 2) pick course from MY PROFILE only
+ opts.add(new MenuOption("pick course from my profile", () -> {
+ var golfer = Session.getCurrentGolfer();
+ Course[] mine = (golfer == null) ? new Course[0] : golfer.getCourses();
- Hole startHole = c.getHoles().get(start - 1);
+ // Checks user has courses of not informs them to add one to there profile
+ if (mine == null || mine.length == 0) {
+ System.out.println("You don't have any courses saved to your profile yet.");
+ System.out.println("Use the 'Add Course to Profile' menu first.");
+ this.present();
+ return;
+ }
+ // Select a course
+ Scanner sc = new Scanner(System.in);
- Round r = new Round(c, LocalDateTime.now(), startHole);
- Session.getCurrentGolfer().addRound(r);
- new HolePlayMenu(r).present();
+ // Prints all courses
+ System.out.println("-- MY COURSES --");
+ for (int i = 0; i < mine.length; i++) {
+ Course c = mine[i];
+ System.out.printf("%d: %s (%s) | Holes: %d | Total Par: %d | Difficulty: %.1f%n",
+ i + 1, c.getName(), c.getLocation(), c.getHoleCount(), c.getTotalPar(),
+ c.getDifficultyRating());
+ }
+ // Select course by number
+ Course selected = null;
+ while (selected == null) {
+ System.out.print("Select course # (1.." + mine.length + "): ");
+ String line = sc.nextLine().trim();
+ int idx = Integer.parseInt(line);
+ if (idx < 1 || idx > mine.length) {
+ System.out.println("Out of range. Try again.");
+ continue;
+ }
+ selected = mine[idx - 1];
+ }
+ // Gets starting hole on course
+ int startHoleNum = readStartingHole(sc, selected.getHoleCount());
+ // Starts round and sends user to HolePlayMenu
+ startRound(selected, startHoleNum);
}));
return opts;
}
+
+ private int readStartingHole(Scanner sc, int holeCount) {
+ // Asks for a hole number until a valid number is selected
+ while (true) {
+ System.out.print("Starting hole (1.." + holeCount + ", blank=1): ");
+ String s = sc.nextLine().trim();
+ if (s.isEmpty())
+ return 1;
+ int start = Integer.parseInt(s);
+ if (start < 1 || start > holeCount) {
+ System.out.println("Starting hole must be between 1 and " + holeCount + ".");
+ continue;
+ }
+ return start;
+ }
+ }
+
+ private void startRound(Course c, int startHoleNum) {
+ Hole startHole = c.getHoles().get(startHoleNum - 1);
+ Round r = new Round(c, LocalDateTime.now(), startHole);
+ Session.getCurrentGolfer().addRound(r);
+ new HolePlayMenu(r).present();
+ }
}
diff --git a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java
index e12bdfa..14e5345 100644
--- a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java
+++ b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java
@@ -44,13 +44,38 @@ public class HolePlayMenu extends Menu {
} else {
// 0) Take a shot
opts.add(new MenuOption("take a shot", () -> {
- // Gets club
+ // loads golfers clubs
+ var golfer = Session.getCurrentGolfer();
+ Club[] clubs = (golfer == null) ? new Club[0] : golfer.getClubs();
+
+ if (clubs.length == 0) {
+ System.out.println("You don't have any clubs yet. Add one first.");
+ new AddClubMenu().present();
+ this.present();
+ return;
+ }
+
+ // list clubs
+ System.out.println("-- YOUR CLUBS --");
+ for (int i = 0; i < clubs.length; i++) {
+ Club c = clubs[i];
+ System.out.printf("%d: #%d %s - %s (%s)%n",
+ i + 1, c.getId(), c.getNickname(), c.getManufacture(), c.getClubType());
+ }
+
+ // user selects one of their clubs
Scanner sc = new Scanner(System.in);
- System.out.print("Club nickname: ");
- String nick = sc.nextLine().trim();
- // Defaulted to Driver for now
- // TODO update logic
- Club club = new Club("Generic", nick, Club.ClubType.DRIVER);
+ Club club = null;
+ while (club == null) {
+ System.out.print("Select club # (1.." + clubs.length + "): ");
+ String line = sc.nextLine().trim();
+ int idx = Integer.parseInt(line);
+ if (idx < 1 || idx > clubs.length) {
+ System.out.println("Out of range. Try again.");
+ continue;
+ }
+ club = clubs[idx - 1];
+ }
// Get shot distance (defaults to 0 of not stated)
System.out.print("Distance (yds, blank=0): ");
diff --git a/src/main/java/design/controller/userinput/menus/SelectUser.java b/src/main/java/design/controller/userinput/menus/SelectUser.java
index 82e2338..ffae559 100644
--- a/src/main/java/design/controller/userinput/menus/SelectUser.java
+++ b/src/main/java/design/controller/userinput/menus/SelectUser.java
@@ -7,12 +7,15 @@ import design.model.Golfer;
import design.runtime.Session;
import design.persistence.PersonalDatabase;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Scanner;
public class SelectUser extends Menu {
private final PersonalDatabase personalDB = PersonalDatabase.INSTANCE;
private final Action doAfter;
+ private final Scanner scanner = new Scanner(System.in);
public SelectUser(Action doAfter) {
this.doAfter = doAfter;
@@ -25,17 +28,44 @@ public class SelectUser extends Menu {
@Override
public List<MenuOption> getMenuOptions() {
- var l = new ArrayList<MenuOption>();
+ var opts = new ArrayList<MenuOption>();
+
for (Golfer i : personalDB.getGolfers()) {
MenuOption menuOption = new MenuOption(i.getUsername(), () -> {
- // Sets user in Session too
- Session.setCurrentGolfer(i);
- System.out.printf("Loaded user: %s%n", i.getUsername());
- doAfter.onCommand();
+ System.out.print("Enter password: ");
+ var password = scanner.nextLine();
+ if (i.checkPassword(password)) {
+ // Sets user in Session too
+ Session.setCurrentGolfer(i);
+ System.out.printf("Loaded user: %s%n", i.getUsername());
+ doAfter.onAction();
+ } else {
+ System.out.println("Incorrect password. ");
+ this.present();
+ }
});
- l.add(menuOption);
+ opts.add(menuOption);
}
- l.add(new MenuOption("<create>", () -> {}));
- return l;
+
+ opts.add(new MenuOption("<create>", () -> {
+
+ System.out.print("Enter username: ");
+ var username = scanner.nextLine();
+
+ System.out.print("Enter full name: ");
+ var fullName = scanner.nextLine();
+
+ System.out.print("Enter password: ");
+ var password = scanner.nextLine();
+
+ try {
+ personalDB.addGolfer(new Golfer(fullName, username, password));
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ this.present();
+ }));
+
+ return opts;
}
}
diff --git a/src/main/java/design/controller/userinput/menus/UserSettings.java b/src/main/java/design/controller/userinput/menus/UserSettings.java
index ab260da..34b645d 100644
--- a/src/main/java/design/controller/userinput/menus/UserSettings.java
+++ b/src/main/java/design/controller/userinput/menus/UserSettings.java
@@ -3,11 +3,21 @@ package design.controller.userinput.menus;
import design.controller.userinput.Action;
import design.controller.userinput.Menu;
import design.controller.userinput.MenuOption;
+import design.model.Golfer;
+import design.persistence.PersonalDatabase;
+import design.runtime.Session;
+import java.io.IOException;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Scanner;
public class UserSettings extends Menu {
+ private final Golfer golfer = Session.getCurrentGolfer();
+ private final PersonalDatabase personalDatabase = PersonalDatabase.INSTANCE;
+ private final Scanner scanner = new Scanner(System.in);
+
@Override
public String getTitle() {
return "user settings";
@@ -15,14 +25,43 @@ public class UserSettings extends Menu {
@Override
public List<MenuOption> getMenuOptions() {
- return List.of(
- new MenuOption("return to main menu", () -> new MainMenu().present()),
- new MenuOption("switch user...", () -> {
- Action doAfter = this::present;
- new SelectUser(doAfter).present();
- }),
- new MenuOption("set username...", () -> {}),
- new MenuOption("set password...", () -> {})
- );
+ var opts = new ArrayList<MenuOption>();
+
+ opts.add(new MenuOption("return to main menu", () -> new MainMenu().present()));
+
+ opts.add(new MenuOption("switch user...", () -> {
+ Action doAfter = this::present;
+ new SelectUser(doAfter).present();
+ }));
+
+ opts.add(new MenuOption("set password...", () -> {
+ System.out.print("Enter password: ");
+ var password = scanner.nextLine();
+
+ golfer.setPassword(password);
+ try {
+ personalDatabase.updateGolfer(golfer);
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ this.present();
+ }));
+
+ opts.add(new MenuOption("set full name...", () -> {
+ System.out.print("Enter full name: ");
+ var fullName = scanner.nextLine();
+
+ golfer.setFullName(fullName);
+ try {
+ personalDatabase.updateGolfer(golfer);
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ this.present();
+ }));
+
+ opts.add(new MenuOption("add a club...", () -> new AddClubMenu().present()));
+
+ return opts;
}
}