import java.util.*;
public class DominoLinkedListFirstLast {
    //  java.lang.Object
    //  +---java.util.AbstractCollection<E>
    //      +---java.util.AbstractList<E> 
    //          +---ArrayList
    //          +---AbstractSequentialList
    //              +---LinkedList
    private LinkedList<Ficha> mesa;
    private LinkedList<Ficha> mano;
    // Sino las declaramos como linked list no podremos usar:
    // addFirst(), addLast(), getFirst(), getLast()
    public static final int MAX_NUM = 2;
    public DominoLinkedListFirstLast() {
        mano = new LinkedList<Ficha>();
        mesa = new LinkedList<Ficha>();
        for (int a = 0; a <= MAX_NUM; a++) {
            for (int b = a; b <= MAX_NUM; b++) {
                if (a == MAX_NUM && b == MAX_NUM) {
                    mesa.add(new Ficha(MAX_NUM, MAX_NUM));
                } else {
                    mano.add(new Ficha(a, b));
                }
            }
        }
    }
    public void tiraFichas() {
        boolean bloqueado = false;
        while (!mano.isEmpty() && !bloqueado) {
            bloqueado = true;
            int r = (int) (Math.random() * mano.size());
            boolean tirada = false;
            int pila_size = mano.size();
            for (int i=0; i< pila_size && !tirada; i++) {
                Ficha f = mano.get(r);
                tirada = true;
                if (f.getB() == mesa.getFirst().getA()) {
                    mesa.addFirst(f);
                } else if (f.getA() == mesa.getFirst().getA()) {
                    mesa.addFirst(f.girarFicha());
                } else if (f.getA() == mesa.getLast().getB()) {
                    mesa.addLast(f);
                } else if (f.getB() == mesa.getLast().getB()) {
                    mesa.addLast(f.girarFicha());
                } else {
                    tirada = false;
                }
                if (tirada) {
                    mano.remove(r);
                    // i--;
                    System.out.println(this);
                    bloqueado = false;
                } else {
                    r = (r+1) % mano.size();
                }
            }
            if (bloqueado) {
                    System.out.println(this);
            }
        }
        if (bloqueado) {
            System.out.println("Juego cerrado a " + mesa.getFirst().getA()+ ".");
        } else {
            System.out.println("Pila vacia.");
        }
    }
    public void vaciaPila() {
        mano.clear();
        System.out.println(this);
    }
    @Override
    public String toString() {
        String s = "";
        s += "mano: ";
        for (Ficha f : mano) {
            s += f;
        }
        s += "\n";
        s += "mesa: ";
        for (Ficha f : mesa) {
            s += f;
        }
        return s;
    }
    public static void main(String[] args) {
        DominoLinkedListFirstLast d = new DominoLinkedListFirstLast();
        System.out.println(d);
        d.tiraFichas();
    }
}
// get[First,Last] Throws: NoSuchElementException - if this list is empty
// peek[First,Last] Igual que get pero Returns: null if this list is empty
