package sac.medicamento;

import java.util.List;
import java.sql.SQLException;
import sac.exception.NullArgumentException;
//import sac.exception.NomeInvalidoException;
import sac.persistencia.PersistenceException;
import sac.persistencia.OID;
import sac.droga.Droga;
import sac.cid.CID;
import sac.doenca.Doenca;
import sac.doenca.DoencaNaoCadastradaException;

/**
 * CadastroMedicamentos controla o acesso e o cadastro de medicamentos no
   conjunto de dados, verificando a validade dos dados.
 */

public class CadastroMedicamento
{
   private RepositorioMedicamento theRepositorioMedicamento;

   /**
    * Construtor da classe: CadastroMedicamento
    *
    * @param repositorio Interface para o acesso ao conjunto de dados
    *        <code>RepositorioMedicamento</code>
    */
   public CadastroMedicamento(RepositorioMedicamento repositorio)
   {
      theRepositorioMedicamento = repositorio;
   }

   /**
    * 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 procurar(OID id) throws MedicamentoNaoCadastradoException,
   NullArgumentException, SQLException, PersistenceException, DoencaNaoCadastradaException {
      if (id != null) {
          return this.theRepositorioMedicamento.procurarMedicamento(id);
      } else {
          throw new NullArgumentException ("Objeto ID nulo");
      }
   }

   /**
    * 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 procurarPeloNome(String nome, int start, int size) throws NullArgumentException,
   PersistenceException, MedicamentoNaoCadastradoException, SQLException, DoencaNaoCadastradaException {
      return this.theRepositorioMedicamento.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 procurarPelaDroga(Droga droga, int start, int size) throws MedicamentoNaoCadastradoException,
   PersistenceException, NullArgumentException, SQLException, DoencaNaoCadastradaException{
      if (droga != null) {
          return this.theRepositorioMedicamento.procurarPelaDroga(droga, start, size);
      } else {
          throw new NullArgumentException("Objeto Droga nulo");
      }
   }

   /**
    * Procurar medicamentos pelo laboratorio
    *
    * @param laboratorio Objeto <code>Laboratorio</code> para consultar em medi-
    *                     dicamentos
    * @return Lista de medicamentos do laboratorio requerido
    */
    public List procurarPeloLaboratorio(Laboratorio laboratorio, int start, int size) throws MedicamentoNaoCadastradoException,
    PersistenceException, SQLException, NullArgumentException, DoencaNaoCadastradaException{
        if (laboratorio != null) {
            return this.theRepositorioMedicamento.procurarPeloLaboratorio(laboratorio, start, size);
        } else {
            throw new NullArgumentException ("Objeto Laboratorio nulo!");
        }
    }

    /**
     * Procurar medicamentos pelo CID
     *
     * @param cid Objeto <code>CID</code> para consultar medicamentos
     *
     * @return Lista de medicamentos com o CID requerido
     */
    public List procurarPeloCID(CID cid) throws MedicamentoNaoCadastradoException, NullArgumentException{
        if (cid != null) {
            return this.theRepositorioMedicamento.procurarPeloCID(cid);
        } else {
            throw new NullArgumentException ("Objeto CID nulo");
        }
    }

    /**
     * Procurar medicamentos pela doenca
     *
     * @param doenca Objeto <code>Doenca</code> para pesquisa medicamentos
     *
     * @return Lista de medicamentos com a doenca requerida
     */
    public List procurarPelaDoenca(Doenca doenca, int start, int size) throws MedicamentoNaoCadastradoException,
    PersistenceException, SQLException, NullArgumentException, DoencaNaoCadastradaException{
        if (doenca != null) {
            return this.theRepositorioMedicamento.procurarPelaDoenca(doenca, start, size);
        } else {
            throw new NullArgumentException ("Objeto Doenca Nulo");
        }
    }

    /**
     * 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 inserir(Medicamento newMedicamento) throws
    MedicamentoJaCadastradoException, PersistenceException, SQLException, NullArgumentException {
        if (newMedicamento != null) {
            if (theRepositorioMedicamento.existe(newMedicamento) == false){
                this.theRepositorioMedicamento.inserir(newMedicamento);
            } else {
                throw new MedicamentoJaCadastradoException ("Medicamento ja cadastrado!");
            }
        } else {
            throw new NullArgumentException ("Objeto Medicamento nulo");
        }
    }

    /**
     * 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 alterar(Medicamento oldMEdicamento, Medicamento newMedicamento)
    throws MedicamentoNaoCadastradoException, NullArgumentException, PersistenceException,
    SQLException, MedicamentoJaCadastradoException {
        if (oldMEdicamento != null && newMedicamento!= null) {
            this.theRepositorioMedicamento.alterar(oldMEdicamento, newMedicamento);
        } else {
            throw new NullArgumentException ("Objeto Medicamento nulo");
        }
    }

    /**
     * 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 getTodosLaboratorios() throws SQLException, NullArgumentException {
        return this.theRepositorioMedicamento.getTodosLaboratorios();
    }
}
