package model;
import java.util.ArrayList;
import java.util.List;
/**
* Facade for the model layer. Manages the lifecycle of one repair session at a time
* and delegates all operations to the current {@link ActiveRepair}.
*
*
Observers registered via {@link #addObserver(RepairOrderObserver)} are
* automatically forwarded to every new repair session that is started.
*/
public class RepairShop {
private ActiveRepair currentRepair;
private final List observers = new ArrayList<>();
private DiscountStrategy discountStrategy = new NoDiscount();
/**
* Creates a new RepairShop ready to accept repair sessions.
*/
public RepairShop() {
}
/**
* Registers an observer to be notified whenever a repair order changes.
* The observer is passed to every repair session started after this call.
*
* @param observer The observer to register.
*/
public void addObserver(RepairOrderObserver observer) {
observers.add(observer);
}
/**
* Sets the discount strategy to apply to each new repair session's total.
*
* @param strategy The discount strategy; must not be {@code null}.
*/
public void setDiscountStrategy(DiscountStrategy strategy) {
this.discountStrategy = strategy;
}
/**
* Starts a new repair session, discarding any previously active session.
*/
public void startRepair() {
currentRepair = new ActiveRepair();
for (RepairOrderObserver observer : observers) {
currentRepair.addObserver(observer);
}
currentRepair.setDiscountStrategy(discountStrategy);
}
/**
* Registers the bike that will be worked on during the current repair session.
*
* @param bike The {@link BikeDTO} of the bike to register.
*/
public void registerBike(BikeDTO bike) {
currentRepair.registerBike(bike);
}
/**
* Adds a repair task to the current session and returns the updated running total.
*
* @param task The {@link TaskDTO} of the task to add.
* @return The running total after the task has been added.
*/
public Amount addTask(TaskDTO task) {
return currentRepair.addTask(task);
}
/**
* Records the mechanic's diagnostic notes for the current repair session.
*
* @param report The diagnostic report text entered by the mechanic.
*/
public void enterDiagnosticReport(String report) {
currentRepair.enterDiagnosticReport(report);
}
/**
* Ends the current repair session and returns the completed repair order.
*
* @return The {@link RepairOrder} for the finished repair.
*/
public RepairOrder endRepair() {
return currentRepair.endRepair();
}
}