diff options
Diffstat (limited to '')
| -rw-r--r-- | data/personaldb.json | 92 | ||||
| -rw-r--r-- | src/main/java/design/controller/userinput/menus/AddClubMenu.java | 77 | ||||
| -rw-r--r-- | src/main/java/design/controller/userinput/menus/HolePlayMenu.java | 37 | ||||
| -rw-r--r-- | src/main/java/design/controller/userinput/menus/UserSettings.java | 2 | ||||
| -rw-r--r-- | src/main/java/design/model/Club.java | 13 | ||||
| -rw-r--r-- | src/main/java/design/model/Golfer.java | 19 |
6 files changed, 195 insertions, 45 deletions
diff --git a/data/personaldb.json b/data/personaldb.json index 75faec5..04ae74d 100644 --- a/data/personaldb.json +++ b/data/personaldb.json @@ -1,7 +1,7 @@ [ { "username": "john_doe", - "passwordHash": 12345, + "passwordHash": 46792755, "fullName": "John Doe", "courses": [ 1, @@ -9,80 +9,104 @@ ], "rounds": [ { - "course": 2, + "course": 1, "dateTime": [ 2025, 10, 7, - 9, - 4, - 6, - 798620300 + 13, + 54, + 37, + 429963500 ], "startingHole": { - "number": 3, + "number": 1, "par": 5 }, "plays": [ { - "holeNumber": 3, + "holeNumber": 1, "swings": [ { - "distance": 1000, + "distance": 100, "clubUsed": { - "manufacture": "Generic", - "nickname": "Tyler", + "id": 1, + "manufacture": "Bobby", + "nickname": "swen 261", "clubType": "DRIVER" } }, { - "distance": 250, + "distance": 5, "clubUsed": { - "manufacture": "Generic", - "nickname": "Tyler", - "clubType": "DRIVER" + "id": 2, + "manufacture": "Bobby", + "nickname": "swen 262", + "clubType": "PUTTER" + } + }, + { + "distance": 1, + "clubUsed": { + "id": 2, + "manufacture": "Bobby", + "nickname": "swen 262", + "clubType": "PUTTER" } } ], - "distance": 1250, - "swingCount": 2 + "swingCount": 3, + "distance": 106 }, { - "holeNumber": 4, + "holeNumber": 2, "swings": [ { - "distance": 125, + "distance": 1000, "clubUsed": { - "manufacture": "Generic", - "nickname": "Dman", + "id": 1, + "manufacture": "Bobby", + "nickname": "swen 261", + "clubType": "DRIVER" + } + }, + { + "distance": 2, + "clubUsed": { + "id": 1, + "manufacture": "Bobby", + "nickname": "swen 261", "clubType": "DRIVER" } } ], - "distance": 125, - "swingCount": 1 + "swingCount": 2, + "distance": 1002 } ], - "currentHoleIndex": 4, - "totalDistance": 1375.0, + "currentHoleIndex": 2, "currentHole": { - "number": 5, - "par": 3 + "number": 3, + "par": 4 }, - "totalSwings": 3 + "totalSwings": 5, + "totalDistance": 1108.0 } ], "clubs": [ { - "manufacture": "TaylorMade", - "nickname": "Old Faithful", + "id": 1, + "manufacture": "Bobby", + "nickname": "swen 261", "clubType": "DRIVER" }, { - "manufacture": "Callaway", - "nickname": "Lucky Seven", - "clubType": "IRON" + "id": 2, + "manufacture": "Bobby", + "nickname": "swen 262", + "clubType": "PUTTER" } - ] + ], + "nextClubId": 3 } ]
\ No newline at end of file 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/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/UserSettings.java b/src/main/java/design/controller/userinput/menus/UserSettings.java index 04ec4d0..34b645d 100644 --- a/src/main/java/design/controller/userinput/menus/UserSettings.java +++ b/src/main/java/design/controller/userinput/menus/UserSettings.java @@ -60,6 +60,8 @@ public class UserSettings extends Menu { this.present(); })); + opts.add(new MenuOption("add a club...", () -> new AddClubMenu().present())); + return opts; } } diff --git a/src/main/java/design/model/Club.java b/src/main/java/design/model/Club.java index 57a43d1..9fa3c87 100644 --- a/src/main/java/design/model/Club.java +++ b/src/main/java/design/model/Club.java @@ -13,16 +13,22 @@ public class Club { PUTTER } + private final int id; private final String manufacture; private final String nickname; private final ClubType clubType; - public Club(String manufacture, String nickname, ClubType clubType) { + public Club(int id, String manufacture, String nickname, ClubType clubType) { + this.id = id; this.manufacture = manufacture; this.nickname = nickname; this.clubType = clubType; } + public int getId() { + return id; + } + public String getManufacture() { return manufacture; } @@ -34,4 +40,9 @@ public class Club { public ClubType getClubType() { return clubType; } + + @Override + public String toString() { + return String.format("#%d %s - %s (%s)", id, nickname, manufacture, clubType); + } } diff --git a/src/main/java/design/model/Golfer.java b/src/main/java/design/model/Golfer.java index 19d6ac6..d34073f 100644 --- a/src/main/java/design/model/Golfer.java +++ b/src/main/java/design/model/Golfer.java @@ -11,15 +11,19 @@ public class Golfer { private String fullName; private final List<Course> courses; private final List<Round> rounds; - private final List<Club> clubs = new ArrayList<>(); // Keep track of golfer's clubs + private final List<Club> clubs; // Keep track of golfer's clubs + private int nextClubId = 1; @JsonCreator - private Golfer(String username, int passwordHash, String fullName, List<Course> courses, List<Round> rounds) { + private Golfer(String username, int passwordHash, String fullName, List<Course> courses, List<Round> rounds, + List<Club> clubs) { this.username = username; this.passwordHash = passwordHash; this.fullName = fullName; this.courses = courses; this.rounds = rounds; + this.clubs = clubs; + this.nextClubId = this.clubs.stream().mapToInt(Club::getId).max().orElse(0) + 1; } public Golfer(String fullName, String username, String password) { @@ -28,6 +32,8 @@ public class Golfer { this.passwordHash = password.hashCode(); this.courses = new ArrayList<>(); this.rounds = new ArrayList<>(); + this.clubs = new ArrayList<>(); + this.nextClubId = 1; } public String getUsername() { @@ -74,12 +80,17 @@ public class Golfer { rounds.add(round); } - // Helpers dealing with clubs - public void addClub(Club c) { + public Club addClub(String manufacture, String nickname, Club.ClubType type) { + Club c = new Club(nextClubId++, manufacture, nickname, type); clubs.add(c); + return c; } public boolean hasClub(Club c) { return clubs.contains(c); } + + public Club[] getClubs() { + return clubs.toArray(Club[]::new); + } } |
