import java.util.ArrayList;
import java.util.List;

/**
 * Razred, ki predstavlja cesto in implementira vmesnik {@link Opazljiv}.
 * Cesta ima ime, dolžino in stanje ter omogoča obveščanje opazovalcev o spremembah.
 */
public class Cesta implements Opazljiv {
    private String ime;
    private double dolzina; // Dolžina ceste v kilometrih
    private String stanje; // Stanje ceste (nov, popravljen, slab)
    private List<Opazovalec> opazovalci; // Seznam opazovalcev

    /**
     * Konstruktor za ustvarjanje nove instance ceste.
     * 
     * @param ime Ime ceste
     * @param dolzina Dolžina ceste v kilometrih
     * @param stanje Stanje ceste
     */
    public Cesta(String ime, double dolzina, String stanje) {
        this.ime = ime;
        this.dolzina = dolzina;
        this.stanje = stanje;
        this.opazovalci = new ArrayList<>();
    }

    /**
     * Getter za ime ceste.
     * 
     * @return Ime ceste
     */
    public String getIme() {
        return ime;
    }

    /**
     * Getter za dolžino ceste.
     * 
     * @return Dolžina ceste v kilometrih
     */
    public double getDolzina() {
        return dolzina;
    }

    /**
     * Getter za stanje ceste.
     * 
     * @return Stanje ceste
     */
    public String getStanje() {
        return stanje;
    }

    /**
     * Setter za ime ceste. Ob nastavitvi imena, obvesti vse opazovalce.
     * 
     * @param ime Novo ime ceste
     */
    public void setIme(String ime) {
        this.ime = ime;
        obvestiOpazovalce();
    }

    /**
     * Setter za dolžino ceste. Ob nastavitvi dolžine, obvesti vse opazovalce.
     * 
     * @param dolzina Nova dolžina ceste v kilometrih
     */
    public void setDolzina(double dolzina) {
        this.dolzina = dolzina;
        obvestiOpazovalce();
    }

    /**
     * Setter za stanje ceste. Ob nastavitvi stanja, obvesti vse opazovalce.
     * 
     * @param stanje Novo stanje ceste
     */
    public void setStanje(String stanje) {
        this.stanje = stanje;
        obvestiOpazovalce();
    }

    /**
     * Dodaj opazovalca, ki bo obveščen o spremembah.
     * 
     * @param opazovalec Opazovalec, ki ga želimo dodati
     */
    @Override
    public void dodajOpazovalca(Opazovalec opazovalec) {
        opazovalci.add(opazovalec);
    }

    /**
     * Obvesti vse opazovalce o spremembah ceste.
     */
    @Override
    public void obvestiOpazovalce() {
        String sporočilo = "Cesta " + ime + " je bila posodobljena. Novo stanje: " + stanje;
        for (Opazovalec opazovalec : opazovalci) {
            opazovalec.posodobi(sporočilo);
        }
    }

    /**
     * Predstavitev podatkov o cesti kot niz.
     * 
     * @return Niz, ki predstavlja cesto
     */
    @Override
    public String toString() {
        return "Cesta{ime='" + ime + "', dolzina=" + dolzina + ", stanje='" + stanje + "'}";
    }
}
