package design.model; import com.fasterxml.jackson.annotation.JsonCreator; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; public class Round { private final Course course; private final LocalDateTime dateTime; private final Hole startingHole; private final List plays; private int currentHoleIndex; @JsonCreator private Round(Course course, LocalDateTime dateTime, Hole startingHole, List plays) { this.course = course; this.dateTime = dateTime; this.startingHole = startingHole; this.plays = plays; // Allows the golfer to start anywhere on the course. Helps HolePalyContext be // simpler. this.currentHoleIndex = Math.max(0, startingHole.getNumber() - 1); } public Round(Course course, LocalDateTime dateTime, Hole startingHole) { this.course = course; this.dateTime = dateTime; this.startingHole = startingHole; plays = new ArrayList<>(); // Allows the golfer to start anywhere on the course. Helps HolePalyContext be // simpler. this.currentHoleIndex = Math.max(0, startingHole.getNumber() - 1); } public int getTotalSwings() { return plays.stream() .map(Play::getSwingCount) .reduce(0, Integer::sum); } public Course getCourse() { return course; } public LocalDateTime getDateTime() { return dateTime; } public Hole getStartingHole() { return startingHole; } public Play[] getPlays() { return plays.toArray(Play[]::new); } public void addPlay(Play play) { plays.add(play); } // Current hole public Hole getCurrentHole() { return course.getHoles().get(currentHoleIndex); } // Handles wraparound too public void nextHole() { currentHoleIndex = (currentHoleIndex + 1) % course.getHoleCount(); } }