package questao1;

/*
 * Universidade Federal de Pernambuco
 * Centro de Informática
 * Agentes Inteligentes / Métodos de Computação Inteligente
 *
 * 1ª Lista de Exercícios
 *
 * Equipe: Adeline de Sousa Silva (adss)
 *         Gsutavo Souza Alves (gsa)
 */


import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;


public class NodeQueue {
    /**
     * A lista onde serão armazenados os elementos.
     */
    private List elements;

    /**
     * Construtor vazio da classe.
     */
    public NodeQueue() {
        elements = new ArrayList();
    }

    /**
     * Diz se a fila está vazia.
     *
     * @return Um boolean que, caso tenho o valor <code>true</code>, indica
     *         que a fila está vazia.
     */
    public boolean isEmpty() {
        return this.elements.isEmpty();
    }

    /**
     * Remove o elemento que se encontra no topo da pilha e o retorna.
     *
     * @return O string que se encontra no topo ds pilha.
     */
    public Node first() {
        Node retorno = null;
        if (!elements.isEmpty()) {
            retorno = (Node) elements.get(0);
            elements.remove(0);
        }

        return retorno;
    }

    /**
     * Adiciona um elemento a fila. Ordenando-o, de acordo com o valor de sua
     * heurística.
     *
     * @param node Um objeto qualquer do tipo <code>Node</code>.
     * @throws java.lang.IllegalArgumentException
     *          Levantada quando o argumento
     *          <code>node</code> for <code>null</code>.
     */
    public void push(Node node) throws IllegalArgumentException {
        if (node == null) {
            throw new IllegalArgumentException();
        }
        this.elements.add(node);
        // ordena os elementos, em termos de f
        Collections.sort(this.elements, new Utils());

    }


    /**
     * Retorna um iterator para que se possa navegar pelos elementos desta fila.
     *
     * @return Iterator para que se possa navegar pelos elementos desta fila.
     */
    public Iterator iterator() {
        return this.elements.iterator();
    }


    /**
     * Diz se o nó passado como parâmetro se encontra nesta fila.
     *
     * @param n
     * @return
     */
    public boolean contains(Node n) {
        return this.elements.contains(n);
    }


    public String toString() {
        StringBuffer sbuffer = new StringBuffer();
        final int size = this.elements.size();
        if (size > 0) {
            for (int i = 0; i < size - 1; i++) {

                sbuffer.append(this.elements.get(i));
                sbuffer.append(", ");
            }
            sbuffer.append(this.elements.get(size - 1));
        }
        return sbuffer.toString();
    }


    public static void main(String[] args) {

        NodeQueue queue = new NodeQueue();
        // cria os nós
        Node n1 = new Node(1, 1, 3);
        Node n2 = new Node(1, 7, 7);
        Node n3 = new Node(1, 9, 1);
        Node n4 = new Node(1, 4, 8);
        Node n5 = new Node(1, 2, 2);
        Node n6 = new Node(1, 5, 5);
        Node n7 = new Node(1, 7, 9);

        // adiciona a fila
        queue.push(n1);
        queue.push(n2);
        queue.push(n3);
        queue.push(n4);
        queue.push(n5);
        queue.push(n6);
        queue.push(n7);


        System.out.println("queue= " + queue);
        System.out.println("Imprimindo primeiro elemento " + queue.first());

    }
}
