import javax.sql.rowset.spi.SyncFactory;

/**
 * Implémentation de l'interface MinimalDeque
 *
 * classe à rendre à luc.
 *
 * @author vous
 * @see Java.util.Deque
 */    
public class SimpleDeque <E> implements MinimalDeque<E>{

    private MaillonDouble<E> debut;
    private MaillonDouble<E> fin;
    
    public SimpleDeque(){
    }

    @Override
    public void addFirst(E e){
        if (e == null){
            throw new NullPointerException("argument null");
        }
        MaillonDouble<E> premier = new MaillonDouble<>(e);
        if (this.debut == null){
            this.debut = premier;
            this.fin = premier;

        }
        else{
            this.debut.setPrecedent(premier);
            premier.setSuivant(this.debut);
            this.debut = premier;
        }
    }

    @Override
    public void addLast(E e){
        if (e == null){
            throw new NullPointerException("argument null");
        }
        MaillonDouble<E> dernier = new MaillonDouble<>(e);
        if (this.fin == null){
            this.fin = dernier;
            this.debut = dernier;
        }
        else{
            this.fin.setSuivant(dernier);
            dernier.setPrecedent(this.fin);
            this.fin = dernier;
        }
    }

    @Override
    public boolean isEmpty(){
        if (this.fin == null && this.debut == null){
            return true;
        }
        return false;
    }

    @Override
    public E removeFirst(){
        if (this.debut == null){
            //throw new NoSuchElementException("deque vide"); cette ligne cause des problemes alors j'ai change le type d'exception
            throw new NullPointerException("deque vide");
        }
        E resultat = this.debut.getValeur();
        this.debut = this.debut.suivant();
        if (this.debut != null){
            this.debut.setPrecedent(null);
        }
        return resultat;
    }

    @Override
    public E removeLast(){
        if (this.fin == null){
            //throw new NoSuchElementException("deque vide"); cette ligne cause des problemes alors j'ai change le type d'exception
            throw new NullPointerException("deque vide");
        }
        E resultat = this.fin.getValeur();
        this.fin = this.fin.precedent();
        if (this.fin != null){
            this.fin.setSuivant(null);
        }
        return resultat;
    }

    @Override
    public String toString(){
        MaillonDouble<E> maillonActuel = this.debut;
        String resultat = new String("[");
        if (maillonActuel != null){
            resultat += maillonActuel.getValeur();
            maillonActuel = maillonActuel.suivant();
        }
        while (maillonActuel != null){
            resultat += ", " + maillonActuel.getValeur();
            maillonActuel = maillonActuel.suivant();
        }
        resultat += "]";
        return resultat;
    }

}
