package model;

import datastruct.Lens;

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


/**
 * A class representing a cell that holds a value and allows adding listeners to track value changes.
 *
 * @param <T> The type of value stored in the cell.
 */
public class Cell<T> implements Lens<T> {

    //TODO: ajouter la ou les propriétés nécessaires

    // la liste des objets écoutant les modifications du contenu de la cellule
    private final List<OnChangeListener<T>> listeners = new ArrayList<>();

    /** Initialize a new cell with a given value.
     *
     * @param initialContent the value initially stored by the cell.
     */
    public Cell(T initialContent) {
        //TODO: à compléter
    }

    /** Add a {@link OnChangeListener} to react to any change of value in the cell.
     *
     * @param listener the {@link OnChangeListener} to activate when the value in the cell is
     *                 changed.
     */
    public void addOnChangeListener(OnChangeListener<T> listener) {
        this.listeners.add(listener);
    }

    /**
     * Sets the content of this {@link Cell}. This will also call all the listeners that were
     * registered by the method {@code addOnChangeListener}.
     *
     * @param value the new content of this {@link Cell}
     */
    public void set(T value) {
        //TODO: modifier le contenu de la cellule, puis appeler les méthodes valueChanged des
        // listeners
    }

    /**
     * Returns the current content of this {@link Cell}.
     *
     * @return the current content of this {@link Cell}
     */
    public T get(){
        //TODO: à compléter
        return null;
    }
}