package exemplo;

import java.util.Enumeration;

public class Sistema  {

    public static final java.lang.String arquivo = "NoSyncNoTransaSemLoop";
    private exemplo.CadastroPessoas pessoas;
    private exemplo.MecanismoPersistencia mecanismoPersistencia;
    private static exemplo.Sistema sistema;

    public static synchronized exemplo.Sistema getInstancia() {
        try {
            if (exemplo.Sistema.sistema == null) {
                exemplo.RepositorioPessoas repositorio = null;
                exemplo.MecanismoPersistencia mecanismoPersistencia = null;
                mecanismoPersistencia = new MecanismoPersistenciaAdHoc("jdbc:oracle:thin:@172.19.33.122:1521:dbgeral", "phmb", "phmb", "oracle.jdbc.driver.OracleDriver");
                repositorio = new RepositorioPessoasBDR((exemplo.MecanismoPersistenciaAdHoc)mecanismoPersistencia);
                exemplo.Sistema.sistema = new Sistema(mecanismoPersistencia, repositorio);
            }
        }
        catch (java.lang.Exception ex) {
            ex.printStackTrace();
            java.lang.System.exit(0);
        }
        return exemplo.Sistema.sistema;
    }

    private Sistema(exemplo.MecanismoPersistencia mecanismoPersistencia, exemplo.RepositorioPessoas repositorio) throws exemplo.BancoDadosException {
        if (repositorio == null || mecanismoPersistencia == null) {
            throw new IllegalArgumentException("Inicializacao invalida");
        }
        try {
            pessoas = new CadastroPessoas(repositorio);
            this.mecanismoPersistencia = mecanismoPersistencia;
            mecanismoPersistencia.conectar();
        }
        catch (java.lang.Exception e) {
            throw new BancoDadosException(e);
        }
    }

    public void finalizar() throws exemplo.BancoDadosException {
        try {
            mecanismoPersistencia.desconectar();
        }
        catch (exemplo.TransacaoBDException ex) {
            throw new BancoDadosException(ex);
        }
    }

    public java.util.Enumeration retornaTodos() throws exemplo.BancoDadosException {
        java.util.Enumeration resposta = pessoas.retornaTodos();
        return resposta;
    }

    public void cadastrar(exemplo.Pessoa pessoa) throws exemplo.BancoDadosException, exemplo.PessoaJaCadastradaException {
        pessoas.cadastrar(pessoa);
    }

    public void remover(java.lang.String cpf) throws exemplo.BancoDadosException, exemplo.PessoaNaoCadastradaException {
        pessoas.remover(cpf);
    }

    public exemplo.Pessoa procurar(java.lang.String cpf) throws exemplo.BancoDadosException, exemplo.PessoaNaoCadastradaException {
        exemplo.Pessoa resposta = pessoas.procurar(cpf);
        return resposta;
    }

    public void atualizar(exemplo.Pessoa pessoa) throws exemplo.ObjetoDesatualizadoException, exemplo.BancoDadosException, exemplo.PessoaNaoCadastradaException {
        pessoas.atualizar(pessoa);
    }
}
