package sac.pessoa.fisica;

/**
 * Projeto: SAC
 *
 * Tipo: CadastroPessoaFisica
 *
 */
import java.util.List;

import sac.doenca.Doenca;
import sac.exception.InvalidArgumentException;
import sac.exception.NullArgumentException;
import sac.persistencia.OID;
import sac.persistencia.PersistenceException;
import sac.pessoa.endereco.Endereco;
import sac.pessoa.PessoaJaCadastradaException;
import sac.pessoa.PessoaNaoCadastradaException;
import sac.pessoa.fisica.jdbc.DBPessoaFisica;
import sac.pessoa.fisica.jdbc.DBTipoServico;

/**
 * Classe que cadastra pessoa ao sistema. Verificando a validade de seus dados. E controlando
 * o acesso as informacoes das pessoas.
 *
 * @see java.util.List;
 * @see sac.doenca.Doenca;
 * @see sac.exception.InvalidArgumentException;
 * @see sac.exception.NullArgumentException;
 * @see sac.persistence.OID;
 * @see sac.pessoa.PessoaJaCadastradaException;
 * @see sac.pessoa.PessoaNaoCadastradaException;
 *
 * @author Edmo Sergio
 * @author Milena Rocha
 * @author Rodrigo Teixeira
 */

public class CadastroPessoaFisica
{
   private RepositorioPessoaFisica repositorio;

   /**
	 * Construtor da classe CadastroPessoaFisica
	 *
	 * @param _repositorio <code>RepositorioPessoaFisica</code> repositorio com acesso ao meio persistente
	 */
   public CadastroPessoaFisica(RepositorioPessoaFisica _repositorio) throws InvalidArgumentException {
	  repositorio = _repositorio;
   }
   /**
	* Metodo que altera uma pessoa do sistema, substituindo seus dadso por o de outra pessoa.
	*
	* @param pessoa <code>PessoaFisica</code> a ser alterada no sistema
	* @param novaPessoa <code>PessoaFisica</code> que contem os novos dados a serem inseridos no sistema.
	* @throw InvalidArgumentException caso o objeto Pessoa seja invalido.
	* @throw PessoaNaoCadastradaException caso a pessoa não esteja cadastrada no sistema.
	*/
   public void alterar(PessoaFisica _pessoa, PessoaFisica novaPessoa)throws InvalidArgumentException,
                  PersistenceException, PessoaNaoCadastradaException{
		if ( _pessoa == null){
			throw new InvalidArgumentException( "Pessoa a ser procurado tem valor nulo.");
		}
		OID  id = _pessoa.getId();
		if ( id == null){
		  _pessoa =  procurar(_pessoa);
		}

		novaPessoa.setId(_pessoa.getId() );
		repositorio.alterar(novaPessoa);
   }
   /**
	* Metodo que cadastra novas pessoas ao sistema.
	*
	* @param pessoa <code>PessoaFisisca</code> a ser cadastrada no sistema
	* @throw InvalidArgumentException caso o objeto Pessoa seja invalido.
	* @throw PessoaJaCadastradaException caso a pessoa já esteja cadastrada no sistema.
	*/
   public void cadastrar(PessoaFisica pessoa) throws InvalidArgumentException,
                PersistenceException, PessoaJaCadastradaException {
		if ( pessoa == null){
			throw new InvalidArgumentException( "Pessoa a ser cadastrada tem valor nulo.");
		} else if (existe(pessoa)) {
			throw new PessoaJaCadastradaException(" Pessoa ja cadastrada nome :"+
			  pessoa.getNome()+", cpf : " + pessoa.getCpf());
		} else {
			 repositorio.inserir(pessoa);
		}
   }
   /**
	* Metodo que indica se uma dada pessoa <code>PessoaFisica</code> jná esta cadastradoao sistema.
	*
	* @param pessoa <code>PessoaFisisca</code> a ser procurada no sistema.
	*/
   public boolean existe(PessoaFisica pessoa) throws PersistenceException{
	  return repositorio.existe(pessoa);
   }
   /**
	* Metodo que procura por uma pessoa no sistema.
	*
	* @param cpf <code>String</code> do cpf utilizado na busca pela pessoa.
	* @throw InvalidArgumentException caso o objeto Pessoa seja invalido.
	* @throw PessoaNaoCadastradaException caso a pessoa não esteja cadastrada no sistema.
	*/
   public PessoaFisica procurar(String cpf)throws InvalidArgumentException,
                PersistenceException, PessoaNaoCadastradaException{
		if ( cpf == null){
			throw new InvalidArgumentException( "cpf a ser procurado tem valor nulo.");
		}
		return repositorio.procurar(cpf);
   }
   /**
	* Metodo que procura por uma pessoa no sistema.
	*
	* @param id <code>OID</code> a ser procurarado no sistema
	* @throw InvalidArgumentException caso o objeto Pessoa seja invalido.
	* @throw PessoaNaoCadastradaException caso a pessoa não esteja cadastrada no sistema.
	*/
   public PessoaFisica procurar( OID id) throws InvalidArgumentException,
            PersistenceException, PessoaNaoCadastradaException{
		if ( id == null){
			throw new InvalidArgumentException( "Pessoa a ser procurado tem valor nulo.");
		}
		PessoaFisica pessoaRetorno = repositorio.procurar(id);
		if (pessoaRetorno == null ){
			throw new PessoaNaoCadastradaException(" Pessoa não cadastrada id :" + id);
		}
		return pessoaRetorno;
   }
   /**
	* Metodo que procura por uma pessoa no sistema.
	*
	* @param filtro <code>FiltroBuscaPessoa</code> utilizado na busca pela pessoa.
	* @throw InvalidArgumentException caso o objeto Pessoa seja invalido.
	* @throw PessoaNaoCadastradaException caso a pessoa não esteja cadastrada no sistema.
	*/
    public List procurar(FiltroBuscaPessoaFisica filtro, int startIndex,
        int size) throws InvalidArgumentException, PersistenceException {

        if ( filtro == null){
            throw new InvalidArgumentException( "filtro a ser procurado tem valor nulo.");
        }
        return repositorio.procurar(filtro, startIndex, size);
   }
   /**
	* Metodo que procura por uma pessoa no sistema.
	*
	* @param pessoa <code>PessoaFisisca</code> a ser procurarada no sistema
	* @throw InvalidArgumentException caso o objeto Pessoa seja invalido.
	* @throw PessoaNaoCadastradaException caso a pessoa não esteja cadastrada no sistema.
	*/
   public PessoaFisica procurar(PessoaFisica pessoa) throws InvalidArgumentException,
            PersistenceException, PessoaNaoCadastradaException{
		if ( pessoa == null){
			throw new InvalidArgumentException( "Pessoa a ser procurado tem valor nulo.");
		}
		PessoaFisica pessoaRetorno = repositorio.procurar(pessoa);
		if (pessoaRetorno == null ){
			throw new PessoaNaoCadastradaException(" Pessoa não cadastrada nome :"+
			  pessoa.getNome()+", cpf : " + pessoa.getCpf());
		}
		return pessoaRetorno;
   }
   /**
    * Metodo que remove uma pessoa do sistema.
    *
    * @param pessoa <code>PessoaFisisca</code> a ser removida do sistema
    * @throw InvalidArgumentException caso o objeto Pessoa seja invalido.
    * @throw PessoaNaoCadastradaException caso a pessoa não esteja cadastrada no sistema.
    */
   public void remover(PessoaFisica pessoa) throws InvalidArgumentException,
        PersistenceException, PessoaNaoCadastradaException{
          if ( pessoa == null){
                  throw new InvalidArgumentException( "Pessoa a ser removida tem valor nulo.");
          } else if (!existe(pessoa)) {
                  throw new PessoaNaoCadastradaException(" Pessoa não cadastrada nome :"+
                    pessoa.getNome()+", cpf : " + pessoa.getCpf());
          } else {
                   repositorio.remover(pessoa);
          }
   }

    public List listarServicos ()  throws PersistenceException {
        RepositorioTipoServico res = DBTipoServico.getInstancia();
        return res.listarServicos();
    }

}
