import java.util.ArrayList;
import java.util.List;

/** Subject: un termómetro que avisa a sus observers de cada lectura. */
public class Thermometer implements TemperatureSource {
    private final String place;
    private final List<TemperatureListener> listeners = new ArrayList<>();

    public Thermometer(String place) {
        this.place = place;
    }

    @Override
    public void addListener(TemperatureListener listener) {
        listeners.add(listener);
    }

    @Override
    public void removeListener(TemperatureListener listener) {
        listeners.remove(listener);
    }

    /** Registra una lectura y notifica a todos, aunque alguno falle. */
    public void record(double celsius) {
        Reading reading = new Reading(place, celsius);
        RuntimeException failure = null;
        // Se recorre una copia: un observer puede darse de baja mientras se le notifica.
        for (TemperatureListener listener : List.copyOf(listeners)) {
            try {
                listener.onReading(reading);
            } catch (RuntimeException e) {
                if (failure == null) {
                    failure = e;
                } else {
                    failure.addSuppressed(e);
                }
            }
        }
        if (failure != null) {
            throw failure;
        }
    }
}
