/*
 * SACFachada.java
 *
 * Created on 28 de Novembro de 2001, 21:49
 */

package sac.fachada;

import java.util.List;
import java.util.Map;
import java.sql.SQLException;

import sac.exception.ItemNaoCadastradoException;
import sac.exception.ItemJaCadastradoException;
import sac.exception.InvalidArgumentException;
import sac.exception.NullArgumentException;
import sac.persistencia.OID;
import sac.persistencia.PersistenceException;
import sac.pessoa.UsuarioComum;
import sac.pessoa.fisica.CadastroPessoaFisica;
import sac.pessoa.fisica.FiltroBuscaPessoaFisica;
import sac.pessoa.fisica.PessoaFisica;
import sac.pessoa.fisica.jdbc.DBPessoaFisica;
import sac.pessoa.juridica.CadastroPessoaJuridica;
import sac.pessoa.juridica.FiltroBuscaPessoaJuridica;
import sac.pessoa.juridica.jdbc.DBPessoaJuridica;
import sac.pessoa.juridica.PessoaJuridica;
import sac.pessoa.fisica.CadastroTipoServico;
import sac.pessoa.fisica.jdbc.DBTipoServico;
import sac.pessoa.juridica.CadastroTipoCategorias;
import sac.pessoa.juridica.jdbc.DBCategoria;
import sac.droga.CadastroDroga;
import sac.droga.DBDroga;
import sac.droga.Droga;
import sac.bibliografia.CadastroReferenciaBibliografica;
import sac.bibliografia.DBReferenciaBibliografica;
import sac.bibliografia.ReferenciaBibliografica;
import sac.bibliografia.ReferenciaBibliograficaNaoCadastradaException;
import sac.bibliografia.FiltroBuscaReferencia;
import sac.doenca.Doenca;
import sac.doenca.CadastroDoenca;
import sac.doenca.DBDoenca;
import sac.doenca.DoencaNaoCadastradaException;
import sac.medicamento.Medicamento;
import sac.medicamento.MedicamentoNaoCadastradoException;
import sac.medicamento.MedicamentoJaCadastradoException;
import sac.medicamento.Laboratorio;
import sac.medicamento.CadastroMedicamento;
import sac.medicamento.DBMedicamento;
import sac.cid.CID;


import sac.exception.NomeInvalidoException;

public class SACFachada {

    /**
     * Cadastro de Pessoa Fisica
     */
     private CadastroPessoaFisica cadPessoaFisica;

     /**
      * Cadastro de Pessoas Juridicas
      */
      private CadastroPessoaJuridica cadPessoaJuridica;

     /**
      * Cadastro de Tipos de Servico
      */
      private CadastroTipoServico cadTipoServico;

     /**
      * Cadastro de Tipos de Categoria
      */
      private CadastroTipoCategorias cadTipoCategoria;

    /**
     * Cadastro de Droga
     */
     private CadastroDroga cadDroga;


    /**
     * Cadastro de Referencia Bibliografica
     */
     private CadastroReferenciaBibliografica cadastroReferencia;

    /**
     * Cadastro de Medicamentos
     */
     private CadastroMedicamento cadastroMedicamentos;

    /**
     * Cadastro de Medicamentos
     */
     private CadastroDoenca cadastroDoencas;

    /** Creates new SACFachada
     *
     * @throws PersistenceException Erro na instanciação dos Cadastros
     * @throws InvalidArgumentException Instancias obtidas dos cadastros foram
     *         inválidas.
     */
    public SACFachada() throws PersistenceException, InvalidArgumentException, NullArgumentException {
        cadPessoaFisica = new CadastroPessoaFisica(DBPessoaFisica.getInstancia());
        cadPessoaJuridica = new CadastroPessoaJuridica(DBPessoaJuridica.getInstancia());
        cadTipoServico = new CadastroTipoServico(DBTipoServico.getInstancia());
        cadTipoCategoria = new CadastroTipoCategorias(DBCategoria.getInstancia());
        cadDroga = new CadastroDroga(DBDroga.getInstancia());
        cadastroReferencia = new CadastroReferenciaBibliografica(DBReferenciaBibliografica.getInstancia());
        cadastroMedicamentos = new CadastroMedicamento(DBMedicamento.getInstancia());
        cadastroDoencas = new CadastroDoenca(DBDoenca.getInstancia());
    }

    /**
     * Busca um usuario por seu login no sistema.
     *
     * @param login login do usuario a ser procurado
     * @param tipoUsuario tipo do Usuario (use as constantes da classe UsuarioComum)
     *
     * @return retorna o usuario procurado no sistema
     *
     * @throws PersistenceException Erro no BD
     * @throws ItemNaoCadastradoException login nao encontrado
     * @throws InvalidArgumentException parametro login null
     */
     public UsuarioComum procuraUsuario(String login, char tipoUsuario)
            throws PersistenceException, ItemNaoCadastradoException,
            InvalidArgumentException {
        UsuarioComum retorno = null;

        if (login == null) {
            throw (new InvalidArgumentException());
        }

        if (tipoUsuario == UsuarioComum.STATUS_PESSOA_FISICA) {
                retorno = cadPessoaFisica.procurar(login);
        } else if (tipoUsuario == UsuarioComum.STATUS_PESSOA_JURIDICA) {
            retorno = cadPessoaJuridica.procurar(login);
        }

        return retorno;
     }

     /**
      * Cadastra uma Pessoa Física no sistema.
      *
      * @param pessoa Pessoa a ser cadastrada no sistema.
      *
     * @throws PersistenceException Erro no BD
     * @throws ItemJaCadastradoException pessoa ja cadastrada
     * @throws InvalidArgumentException parametro pessoa null
      */
    public void cadastraPessoaFisica(PessoaFisica pessoa)
        throws PersistenceException,  InvalidArgumentException,
        ItemJaCadastradoException {

        if (pessoa == null) {
          throw new InvalidArgumentException();
        }

        cadPessoaFisica.cadastrar(pessoa);
      }

    /**
     * Busca um usuario por seu OID
     *
     * @param oid oid do usuario a ser procurado
     * @param tipoUsuario tipo do Usuario (use as constantes da classe UsuarioComum)
     *
     * @return retorna o usuario procurado no sistema
     *
     * @throws InvalidArgumentException parametro oid null
      * @throws PersistenceException Erro no BD
     * @throws ItemNaoCadastradoException oid nao encontrado
     */
     public UsuarioComum procuraUsuario(OID oid, char tipoUsuario)
            throws PersistenceException, ItemNaoCadastradoException,
            InvalidArgumentException {
        UsuarioComum retorno = null;

        if (oid == null) {
            throw (new InvalidArgumentException());
        }

        if (tipoUsuario == UsuarioComum.STATUS_PESSOA_FISICA
            || tipoUsuario == UsuarioComum.STATUS_OPERADOR) {
                retorno = cadPessoaFisica.procurar(oid);
        } else if (tipoUsuario == UsuarioComum.STATUS_PESSOA_JURIDICA) {
            retorno = cadPessoaJuridica.procurar(oid);
        }

        return retorno;
     }

   /**
     * Cadastra uma Pessoa Juridica no sistema.
     *
     * @param pessoa Pessoa a ser cadastrada no sistema.
     *
     * @throws PersistenceException Erro no BD
     * @throws ItemJaCadastradoException pessoa ja cadastrada
     * @throws InvalidArgumentException parametro pessoa null
     */
    public void cadastraPessoaJuridica(PessoaJuridica pessoa)
        throws PersistenceException, InvalidArgumentException,
        ItemJaCadastradoException {

        cadPessoaJuridica.cadastrar(pessoa);
    }



    public List consultaPessoaFisica(FiltroBuscaPessoaFisica filtro,
        int startIndex, int size) throws PersistenceException,
        InvalidArgumentException {

        return cadPessoaFisica.procurar(filtro, startIndex, size) ;
    }

    public List consultaPessoaJuridica(FiltroBuscaPessoaJuridica filtro,
        int startIndex, int size) throws PersistenceException,
        InvalidArgumentException {

        return cadPessoaJuridica.procurar(filtro, startIndex, size) ;
    }

    /**
     * Lista todos os tipos de servicos
     *
     * @return retorna um List constendo String com os nomes dos tipos de servico
     *
     * @throws PersistenceException Erro no BD
     */
    public List listarServicos () throws PersistenceException{
        return cadPessoaFisica.listarServicos();
    }

    public List listarDoencas ()  throws PersistenceException{
        return sac.doenca.DBDoenca.getInstancia().getTodasDoencas();
    }

    public List listarDrogas ()  throws PersistenceException, NullArgumentException{
        return sac.droga.DBDroga.getInstancia().obtemDrogas();
    }

    public Map listarCategorias ()  throws PersistenceException{
        return sac.pessoa.juridica.jdbc.DBCategoria.getInstancia().listarCategoria();
    }


    /**
     * Altera uma Pessoa Fisica no sistema.
     *
     * @param antiga Pessoa antiga a ser removida no sistema.
     * @param nova Pessoa nova a ser cadastrada no sistema.
     *
     * @throws PersistenceException Erro no BD
     * @throws ItemNaoCadastradoException pessoa antiga nao cadastrada
     * @throws InvalidArgumentException parametro pessoa null
      */
      public void alteraPessoa(PessoaFisica antiga, PessoaFisica nova) throws PersistenceException,
                                                            InvalidArgumentException,
                                                            ItemNaoCadastradoException {
        cadPessoaFisica.alterar(antiga, nova);
      }

      public void alteraPessoa(PessoaJuridica antiga, PessoaJuridica nova) throws PersistenceException,
                                                            InvalidArgumentException,
                                                            ItemNaoCadastradoException {
        cadPessoaJuridica.alterar(antiga, nova);
      }
   /**
     * Cadastra um Tipo de Serviço no sistema.
     *
     * @param servico String a ser cadastrad no sistema.
     *
     * @throws PersistenceException Erro no BD
     * @throws ItemJaCadastradoException pessoa ja cadastrada
     * @throws InvalidArgumentException parametro pessoa null
     */
    public void cadastraTipoServico(String servico)
        throws PersistenceException, InvalidArgumentException,
        ItemJaCadastradoException {

        cadTipoServico.cadastrar(servico);
    }

    public void cadastraCategoria(String categoria)
            throws PersistenceException, InvalidArgumentException,
            ItemJaCadastradoException {
        cadTipoCategoria.cadastrarCategoria(categoria);
    }

    public void cadastraSubCategoria(String subCategoria)
            throws PersistenceException, InvalidArgumentException,
            ItemJaCadastradoException {
        cadTipoCategoria.cadastrarSubCategoria(subCategoria);
    }

    public void cadastraRelCategoria(String categoria, String subCategoria)
            throws PersistenceException, InvalidArgumentException, ItemJaCadastradoException {
        cadTipoCategoria.cadastrarRelCategoria(categoria, subCategoria);
    }
/*Droga--------------------------------------------------------------*/
     /**
      * Cadastra uma Droga no sistema.
      *
      * @param droga Droga a ser cadastrada no sistema.
      *
     * @throws PersistenceException Erro no BD
     * @throws ItemJaCadastradoException droga ja cadastrada
     * @throws InvalidArgumentException parametro droga null
      */
      public void cadastrarDroga(Droga droga) throws PersistenceException,
                                                    NullArgumentException,
                                                    ItemJaCadastradoException,
                                                    InvalidArgumentException {
        if (droga == null) {
          throw new InvalidArgumentException();
        }

        cadDroga.inserir(droga);
      }

    /**
     * Retorna uma droga com determinado ID
     *
     * @param id    id da droga <code>OID</code>
     * @return droga procurada <code>Droga</code>
     * @throws PersistenceException
     * @throws ItemNaoCadastradoException
     * @throws NullArgumentException;
     */
      public Droga procurarDroga(OID oid) throws PersistenceException,
                                                    NullArgumentException,
                                                    ItemNaoCadastradoException,
                                                    InvalidArgumentException {
        if (oid == null) {
          throw new InvalidArgumentException("oid == null");
        }

        return cadDroga.procurar(oid);
      }

    /**
     * Altera uma droga ja cadastrada
     *
     * @param droga   Droga a ser alterada <code>Droga</code>
     * @param newDroga   Droga com novos os parametros <code>Droga</code>
     * @exception DrogaNaoCadastradaException - Levantada quando tenta-se
     *            acessar uma droga nao cadastrada.
     * @throws PersistenceException
     * @throws DrogaNaoCadastradaException
     * @throws NullArgumentException;
     */
      public void alterarDroga(Droga droga, Droga newDroga) throws PersistenceException,
                                                    NullArgumentException,
                                                    ItemNaoCadastradoException,
                                                    InvalidArgumentException {
        if (droga == null || newDroga == null) {
          throw new InvalidArgumentException();
        }

        cadDroga.alterar(droga, newDroga);
      }

    /**
     * Retorna uma droga com determinado nome
     *
     * @param nome    nome da droga <code>String</code>
     * @return droga procurada <code>Droga</code>
     * @throws PersistenceException
     * @throws DrogaNaoCadastradaException
     * @throws NullArgumentException;
     */
     public List procurarDrogaPeloNome(String nome)
        throws PersistenceException, ItemNaoCadastradoException,
            NullArgumentException {
      if(nome == null) {
        throw new NullArgumentException("nome == null");
      }
        return cadDroga.procurarPeloNome(nome);
    }

    /**
     * Retorna uma droga com determinadas acoes terapeuticas
     *
     * @param acoesTerapeuticas    Acoes Terapeuticas da droga <code>String</code>
     * @return Lista de drogas <code>List</code>
     * @throws PersistenceException
     * @throws DrogaNaoCadastradaException
     * @throws NullArgumentException;
     */
    public List procurarDrogaPorAcoesTerapeuticas(String acoesTerapeuticas)
        throws PersistenceException, ItemNaoCadastradoException,
            NullArgumentException {
      if(acoesTerapeuticas == null) {
        throw new NullArgumentException("acoesTerapeuticas == null");
      }
        return cadDroga.procurarPorAcoesTerapeuticas(acoesTerapeuticas);
    }
/*----------------------------------------------------------------------------*/

//referenciaBibliografica inicio
      public void cadastraReferenciaBibliografica(ReferenciaBibliografica referencia) throws PersistenceException,
                                                    NullArgumentException,
                                                    ItemJaCadastradoException,
                                                    InvalidArgumentException, NomeInvalidoException {
        if (referencia == null) {
          throw new InvalidArgumentException();
        }
        cadastroReferencia.inserir(referencia);
      }

      public ReferenciaBibliografica procuraReferenciaBibliografica(OID oid) throws InvalidArgumentException, ReferenciaBibliograficaNaoCadastradaException, NullArgumentException, PersistenceException, NomeInvalidoException {
        if (oid == null) {
          throw new InvalidArgumentException();
        }
        return cadastroReferencia.procurar(oid);
      }

      public void alterarReferenciaBibliografica (ReferenciaBibliografica oldRef, ReferenciaBibliografica newRef) throws InvalidArgumentException, PersistenceException, ReferenciaBibliograficaNaoCadastradaException {
        if (oldRef == null || newRef == null) {
          throw new InvalidArgumentException();
        }
        cadastroReferencia.alterar(oldRef, newRef);
      }

      public List procuraReferenciaBibliografica (FiltroBuscaReferencia filtro) throws NomeInvalidoException, InvalidArgumentException, NullArgumentException, PersistenceException, ReferenciaBibliograficaNaoCadastradaException {
        if (filtro == null) {
          throw new InvalidArgumentException();
        }
        return cadastroReferencia.procurar(filtro);
      }
//referenciaBibliografica fim


// Medicamentos inicio

    /**
     * Alterar medicamento cadastrado
     *
     * @param oldMedicamento Objeto <code>Medicamento</code> antigo
     * @param newMedicamento Objeto <code>Medicamento</code> novo
     *
     * @exception MedicamentoNaoCadastradoException Caso objeto procurado nao
     *                                              esteja cadastrado
     */
    public void alterarMedicamento(Medicamento oldMEdicamento, Medicamento newMedicamento)
    throws MedicamentoNaoCadastradoException, NullArgumentException, PersistenceException,
    SQLException, MedicamentoJaCadastradoException {
        this.cadastroMedicamentos.alterar(oldMEdicamento, newMedicamento);
    }

    /**
     * Retorna uma doenca com determinado nome
     *
     * @param nome    nome da doenca <code>String</code>
     * @return doenca procurada <code>Doenca</code>
     */
    public Doenca procurarDoenca(String nome)throws NullArgumentException,
    DoencaNaoCadastradaException, PersistenceException
    {
        return  this.cadastroDoencas.procurarPeloNome(nome);
    }

   /**
    * Busca um medicamento por sua ID
    *
    * @param id <code>OID</code> Identificador do medicamento
    *
    * @return Medicamento que possui o ID requerido
    *
    * @exception MedicamentoNaoCadastradoException Para medicamentos nao cadastrados
    */
    public Medicamento procurarMedicamento(OID id) throws MedicamentoNaoCadastradoException,
    NullArgumentException, SQLException, PersistenceException, DoencaNaoCadastradaException {
        return this.cadastroMedicamentos.procurar(id);
    }

    /**
     * Procurar medicamentos pelo nome
     *
     * @param nome <code>String</code> com o nome ou parte do nome do medicamento
     *
     * @return Lista de medicamento com o nome requerido
     *
     */
    public List procurarMedicamentoPeloNome(String nome, int start, int size) throws NullArgumentException,
    PersistenceException, MedicamentoNaoCadastradoException, SQLException, DoencaNaoCadastradaException {
       return cadastroMedicamentos.procurarPeloNome(nome, start, size);
    }

     /**
      * Procurar medicamentos pela droga
      *
      * @param droga Objeto <code>Droga</code> para consulta em medicamentos
      *
      * @return Lista de medicamentos com a droga requerida
      */
     public List procurarMedicamentoPelaDroga(Droga droga, int start, int size) throws MedicamentoNaoCadastradoException,
     PersistenceException, NullArgumentException, SQLException, DoencaNaoCadastradaException{
        return this.cadastroMedicamentos.procurarPelaDroga(droga, start, size);
     }

     /**
      * Procurar medicamentos pelo laboratorio
      *
      * @param laboratorio Objeto <code>Laboratorio</code> para consultar em medi-
      *                     dicamentos
      * @return Lista de medicamentos do laboratorio requerido
      */
      public List procurarMedicamentoPeloLaboratorio(Laboratorio laboratorio, int start, int size) throws MedicamentoNaoCadastradoException,
      PersistenceException, SQLException, NullArgumentException, DoencaNaoCadastradaException{
          return this.cadastroMedicamentos.procurarPeloLaboratorio(laboratorio, start, size);
      }

      /**
       * Procurar medicamentos pelo CID
       *
       * @param cid Objeto <code>CID</code> para consultar medicamentos
       *
       * @return Lista de medicamentos com o CID requerido
       */
      public List procurarMedicamentoPeloCID(CID cid) throws MedicamentoNaoCadastradoException, NullArgumentException{
          return this.cadastroMedicamentos.procurarPeloCID(cid);
      }

     /**
       * Procurar medicamentos pela doenca
       *
       * @param doenca Objeto <code>Doenca</code> para pesquisa medicamentos
       *
       * @return Lista de medicamentos com a doenca requerida
       */
      public List procurarMedicamentoPelaDoenca(Doenca doenca, int start, int size) throws MedicamentoNaoCadastradoException,
      PersistenceException, SQLException, NullArgumentException, DoencaNaoCadastradaException{
          return this.cadastroMedicamentos.procurarPelaDoenca(doenca, start, size);
      }

    /**
     * Inserir um medicamento no repositorio
     *
     * @param newMedicamento Objeto <code>Medicamento</code> para ser cadastrado
     *
     * @exception MedicamentoJaCadastradoException Caso o objeto ja tenha sido
     *                                              cadastrado
     */
    public void cadastrarMedicamento(Medicamento newMedicamento) throws
    MedicamentoJaCadastradoException, PersistenceException, SQLException, NullArgumentException {
        cadastroMedicamentos.inserir(newMedicamento);
    }

    /**
     * Obter os nomes de todos os laboratorios que tem medicamento cadastrado
     *
     * @return  List Lista de String com os nomes dos laboratorios
     *
     * @exception SQLException  Erro na instrucao SQL
     */
    public List getLaboratorios() throws SQLException, NullArgumentException {
        return this.cadastroMedicamentos.getTodosLaboratorios();
    }

// Medicamentos fim

}
