package celular.palavras.dados;

/**
 * Universidade Federal de Pernambuco
 * Centro de Informática
 * Disciplina: Introducao a Programação
 * Projeto Celular
 *
 * Tipo: PalavrasList
 *
 * @author: Milena Rocha Leite     (mrl@cin.ufpe.br)
 *
 * @since 2002
 * @version 1.1
 */
import java.util.Vector;
import java.util.List;
import java.util.Iterator;

import celular.palavras.IListaPalavras;
import celular.palavras.Palavra;
import celular.palavras.PalavraSimples;
import celular.palavras.excecoes.PalavraNaoExisteException;
import celular.util.excecoes.ParametroNuloException;


public class PalavrasList implements IListaPalavras{

	private List elementos;
	private final static byte NAO_EXISTE = -1;

	/**
	 * Construtor da classe PalavrasList
	 */
	public PalavrasList() {
		this.elementos = new Vector();
	}
	/**
	 * Método que exclui uma palavra da colecao
	 *
	 * @param Palavra  palvra a ser excluída
	 */
	public void excluir(Palavra palavra) throws PalavraNaoExisteException{

		if (palavra != null){
			if(elementos.remove(palavra) == false){
				throw new PalavraNaoExisteException("A palavra a ser excluida "
													+"nao existe" );
			}
		} else {
			throw new ParametroNuloException("A palavra a ser excluída está nula");
		}
	}
	 /**
	  * Método que indica se uma palavra existe na colecao
	  *
	  * @param  Palavra   palavra a ser procurada
	  * @return boolean   boleano que informa se a palavra existe ou nao na colecao
	  */
	 public boolean existe(Palavra palavra) {
		 boolean resposta = false;

		if (palavra != null){
			resposta = this.elementos.contains(palavra);
		} else {
			 throw new ParametroNuloException("A palavra passada como parametro estah"
											  + "nula");
		 }
		 return resposta;
	}
	/**
	 * Método que retorna todas as palavras do dicionario que possuem uma das
	 * letras passadas da posicao indicada
	 *
	 * @param  char[]         characteres a serem verificados
	 * @return ListaPalavras  lista de palavras que possuem um dos caracteres
	 *                          passados
	 */
	public IListaPalavras filtrar(char[] letras,int posicaoAtual) throws PalavraNaoExisteException{
		IListaPalavras retorno = new PalavrasList();
		Palavra palavra = null;
		IteradorLista id = this.getIterador();

		while(id.temProxima()){
			palavra = (Palavra)id.proxima();
			if(palavra.temLetras(letras,posicaoAtual)){
				retorno.inserir(palavra);
			}
		}
		if(retorno.getTamanho() == 0){
		  throw new PalavraNaoExisteException("Nao existe uma palvra com essa "+
											  "sequencia de digitos");
		}
		return retorno;
	}
	/**
	 * Método que retorna o iterator da lista de elementos
	 *
	 * @return IteradorLista
	 */
	public IteradorLista getIterador(){
		IteradorLista iterador = new  IteradorLista(this.elementos);
		return iterador;
	}
	/**
	 * Método retorna o tamanho atual da colecao
	 *
	 * @return  int  tamanho da colecao
	 */
	public int getTamanho(){
		return this.elementos.size();
	}
	/**
	 * Método que insere uma palavra na colecao
	 *
	 * @param Palvra   plavra a ser inserida
	 */
	public void inserir(Palavra palavra) throws ParametroNuloException{
		if (palavra != null){
			elementos.add(palavra);
		} else {
			throw new ParametroNuloException("A palavra a ser inserida está nula");
		}
	}
	/**
	 * Método que retorna a posicao de uma palavra no conjunto
	 *
	 * @param Palavra    palavra a ser procurada
	 * @return int       que indica a posicao da palavra procurada
	 */
	public int posicao(Palavra palavra) {

		int posicao = 0;
		if(palavra != null){
			posicao = this.elementos.indexOf(palavra);
			return posicao;
		} else {
			throw new ParametroNuloException("A palavra passada como parametro "
											  + "estah nula" );
		}
	}
}
