package sac.medicamento;

import sac.persistencia.OID;
import java.util.List;
import sac.droga.Droga;
import sac.cid.CID;
import sac.doenca.Doenca;
import sac.doenca.DoencaNaoCadastradaException;
import java.sql.SQLException;
import sac.exception.NullArgumentException;
import sac.persistencia.PersistenceException;
//import sac.exception.NomeInvalidoException;

public interface RepositorioMedicamento
{

   /**
    * 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 PersistenceException,
    SQLException, MedicamentoNaoCadastradoException, NullArgumentException, DoencaNaoCadastradaException;

   /**
    * 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 MedicamentoNaoCadastradoException,
   PersistenceException, NullArgumentException, SQLException, DoencaNaoCadastradaException;

   /**
    * 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;

   /**
    * 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;

    /**
     * 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;

    /**
     * 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;

    /**
     * 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;

    /**
     * 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 oldM, Medicamento newM) throws MedicamentoNaoCadastradoException,
   PersistenceException, NullArgumentException, SQLException, MedicamentoJaCadastradoException;

   /**
    * Retorna se o objeto ja esta cadastrado
    *
    * @param medicamento <code>Medicamento</code> Objeto a ser procurado
    *
    * @return Boolean representando a existencia do objeto no conjunto
    */
   public boolean existe(Medicamento medicamento) throws NullArgumentException, SQLException;

    /**
     * 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;

}

