package sac.pessoa.juridica;

/**
 * Projeto: SAC
 *
 * Tipo: CadastroPessoaJuridica
 *
 */

import java.util.List;

import sac.pessoa.PessoaJaCadastradaException;
import sac.pessoa.PessoaNaoCadastradaException;
import sac.exception.InvalidArgumentException;
import sac.persistencia.OID;
import sac.persistencia.PersistenceException;

public class CadastroPessoaJuridica
{
   private RepositorioPessoaJuridica repositorio;


/**
 * Construtor da classe CadastroPessoaJuridica
 *
 * @param _repositorio <code>RepositorioPessoaJuridica</code> repositorio com acesso ao meio persistente
 */
 public CadastroPessoaJuridica(RepositorioPessoaJuridica _repositorio) throws InvalidArgumentException {
	repositorio = _repositorio;
 }
/**
 * Metodo que altera uma empresa que esteja cadastrada no sistema,
 * substituindo seus dados por o de outra empresa.
 *
 * @param empresa <code>PessoaJuridica</code> a ser alterada no sistema
 * @param novaEmpresa <code>PessoaJuridica</code> que contem os novos dados a serem inseridos no sistema.
 *
 * @throw InvalidArgumentException caso o objeto PessoaJuridica seja invalido.
 * @throw PessoaNaoCadastradaException caso a pessoanjuridica(empresa) não esteja cadastrada no sistema.
 */
public void alterar(PessoaJuridica _empresa, PessoaJuridica novaEmpresa)
    throws PersistenceException, InvalidArgumentException, PessoaNaoCadastradaException{
	if ( _empresa == null){
		throw new InvalidArgumentException( "Empres a ser procurada tem valor nulo.");
	}
	OID  id = _empresa.getId();
	if ( id == null){
	  _empresa =  procurar(_empresa);
	}

	novaEmpresa.setId(_empresa.getId() );
	repositorio.alterar(novaEmpresa);
}
/**
 * Metodo que cadastra novas empresas ao sistema.
 *
 * @param empresa <code>PessoaJuridica</code> a ser cadastrada no sistema
 *
 * @throw InvalidArgumentException caso o objeto PessoaJuridica seja invalido.
 * @throw PessoaJaCadastradaException caso a pessoa juridica(empresa) já esteja cadastrada no sistema.
 */
 public void cadastrar(PessoaJuridica empresa) throws InvalidArgumentException,PessoaJaCadastradaException, PersistenceException {
	if ( empresa == null){
		throw new InvalidArgumentException( "Empresa a ser cadastrada tem valor nulo.");
	} else if (existe(empresa)) {
		throw new PessoaJaCadastradaException(" Empresa ja cadastrada, cnpj : " + empresa.getCnpj());
	} else {
	 repositorio.inserir(empresa);
	}
 }
/**
 * Metodo que indica se uma dada empresa <code>PessoaJuridica</code> já está cadastrado no sistema.
 *
 * @param empresa <code>PessoaJuridica</code> a ser procurada no sistema.
 */
 public boolean existe(PessoaJuridica empresa) throws PersistenceException{
	return repositorio.existe(empresa);
}
/**
 * Metodo que procura por uma empresa no sistema a partir do cnpj.
 *
 * @param cnpj <code>string</code> a ser procurarada no sistema
 *
 * @throw InvalidArgumentException caso o objeto Pessoa Juridica seja invalido.
 * @throw PessoaNaoCadastradaException caso a pessoa não esteja cadastrada no sistema.
 */
 public PessoaJuridica procurar(String cnpj) throws PersistenceException, InvalidArgumentException, PessoaNaoCadastradaException{
	if ( cnpj == null){
		throw new InvalidArgumentException( "Empresa a ser procurado tem valor nulo.");
	}
	PessoaJuridica empresaRetorno = repositorio.procurar(cnpj);
	if (empresaRetorno == null ){
		throw new PessoaNaoCadastradaException(" Empresa não cadastrada cnpj : " + cnpj);
	}
	return empresaRetorno;
   }
/**
 * Metodo que procura por uma empresa no sistema através do id.
 *
 * @param id <code>OID</code> a ser procurarado no sistema
 *
 * @throw InvalidArgumentException caso o objeto PessoaJuridica seja invalido.
 * @throw PessoaNaoCadastradaException caso a pessoa juridica não esteja cadastrada no sistema.
 */
 public PessoaJuridica procurar(OID id) throws PersistenceException, InvalidArgumentException, PessoaNaoCadastradaException{
	if ( id == null){
		throw new InvalidArgumentException( "Empresa a ser procurada tem valor nulo.");
	}
	PessoaJuridica pessoaRetorno = repositorio.procurar(id);
	if (pessoaRetorno == null ){
		throw new PessoaNaoCadastradaException("Empresa não cadastrada id :" + id);
	}
	return pessoaRetorno;
 }
/**
 * Metodo que procura por uma empresa no sistema.
 *
 * @param pessoa <code>PessoaJuridica</code> a ser procurarada no sistema
 *
 * @throw InvalidArgumentException caso o objeto PessoaJuridica seja invalido.
 * @throw PessoaNaoCadastradaException caso a pessoa juridica não esteja cadastrada no sistema.
 */
 public PessoaJuridica procurar(PessoaJuridica empresa) throws PersistenceException, InvalidArgumentException, PessoaNaoCadastradaException{
	if ( empresa == null){
		throw new InvalidArgumentException( "Empresa a ser procurado tem valor nulo.");
	}
	PessoaJuridica empresaRetorno = repositorio.procurar(empresa);
	if (empresaRetorno == null ){
		throw new PessoaNaoCadastradaException(" Empresa não cadastrada nome :"+
		  										empresa.getNome()+", cnpj : " + empresa.getCnpj());
	}
	return empresaRetorno;
 }

    /**
     * Metodo que procura por uma empresa no sistema a partir de um filtro.
     *
     * @param filtro <code>PessoaJuridica</code> a ser procurarada no sistema
     *
     * @return List   Contendo as empresas encontradas pela pesquisa
     *
     * @throw InvalidArgumentException caso o objeto PessoaJuridica seja invalido.
     */
    public List procurar(FiltroBuscaPessoaJuridica filtro, int startIndex,
        int size) throws InvalidArgumentException, PersistenceException {

        if ( filtro == null){
	    throw new InvalidArgumentException( "Filtro a ser procurado tem valor nulo.");
	}
	List empresaRetorno = repositorio.procurar(filtro, startIndex, size);
	return empresaRetorno;
 }

 /**
 * Metodo que remove uma empresa do sistema.
 *
 * @param pessoa <code>PessoaJuridica</code> a ser removida do sistema
 *
 * @throw InvalidArgumentException caso o objeto PessoaJuridica seja invalido.
 * @throw PessoaNaoCadastradaException caso a pessoa juridica não esteja cadastrada no sistema.
 */
 public void remover(PessoaJuridica empresa) throws PersistenceException, InvalidArgumentException,PessoaNaoCadastradaException{
	if ( empresa == null){
		throw new InvalidArgumentException( "Empresa a ser removida tem valor nulo.");
	} else if (!existe(empresa)) {
		throw new PessoaNaoCadastradaException("Empresa não cadastrada nome :"+
		  										empresa.getNome()+", cnpj : " + empresa.getCnpj());
	} else {
		 repositorio.remover(empresa);
	}
 }
}