summaryrefslogtreecommitdiff
path: root/src/main/java/design/controller/userinput/menus/ManageClubs.java
blob: 6290444604a2db8a5d7e4b017a8e5c9c6aaac958 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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.Arrays;
import java.util.List;
import java.util.Scanner;

public class ManageClubs extends Menu {
    private final Golfer golfer = Session.getCurrentGolfer();
    private final PersonalDatabase personalDB = PersonalDatabase.INSTANCE;

    @Override
    public String getTitle() {
        return "manage clubs";
    }

    @Override
    public List<MenuOption> getMenuOptions() {
        List<MenuOption> opts = new java.util.ArrayList<>();
        opts.add(new MenuOption("return to main menu", () -> new MainMenu().present()));

        opts.add(new MenuOption("list clubs", () -> {
            for (Club club : golfer.getClubs()) {
                System.out.printf("- %s\n", club);
            }
            this.present();
        }));

        opts.add(new MenuOption("remove club...", () -> {
            var selector = new SelectClub();
            selector.present();
            golfer.removeClub(selector.getResult());
            try {
                personalDB.updateGolfer(golfer);
            } catch (IOException ex) {
                System.out.println("Failed to update golfer.");
            }
            this.present();
        }));

        opts.add(new MenuOption("add club...", () -> {
            Scanner sc = new Scanner(System.in);

            System.out.print("Manufacturer: ");
            String manufacture = sc.nextLine().trim();

            System.out.print("Nickname: ");
            String nickname = sc.nextLine().trim();

            var selector = new SelectClubType();
            selector.present();
            Club.ClubType type = selector.getResult();

            golfer.addClub(manufacture, nickname, type);

            // Add club to JSON
            try {
                personalDB.updateGolfer(golfer);
                System.out.println("Club added and saved.");
            } catch (IOException e) {
                throw new RuntimeException("Failed to save club", e);
            }
            this.present();
        }));

        return opts;
    }

    private static class SelectClubType extends Menu {
        private Club.ClubType result;

        @Override
        public String getTitle() {
            return "select club type";
        }

        public Club.ClubType getResult() {
            return result;
        }

        @Override
        public List<MenuOption> getMenuOptions() {
            return Arrays.stream(Club.ClubType.values())
                    .map(t -> new MenuOption(t.name(), () -> result = t))
                    .toList();
        }
    }
}