
package sac.doenca;

//main
import sac.persistencia.OIDFactory;

// normal
import sac.exception.NullArgumentException;
import java.util.List;
import java.util.LinkedList;
import java.util.Iterator;
import sac.cid.CID;
import sac.medicamento.Medicamento;
import sac.persistencia.PersistenceException;
import sac.persistencia.OID;

/**
 * Esta classe representa um  Cadastro de doencas
 */
public class CadastroDoenca
{
   //O objeto 'RepositorioDoenca'
   private RepositorioDoenca repositorioDoenca;

   /**
    * Construtor da classe
    * @param repositorio       Repositorio de Doencas a ser utilizado <code>RepositorioDoenca</code>
    */
   public CadastroDoenca(RepositorioDoenca repositorio) throws NullArgumentException
   {
        if(repositorio == null) {
            throw new NullArgumentException("repositorio == null");
        }
        this.repositorioDoenca = repositorio;
   }

   /**
    * Retorna uma doenca com determinado OID
    *
    * @param id    oid da doenca <code>OID</code>
    * @return doenca procurada <code>Doenca</code>
    * @exception DoencaNaoCadastradaException
    */
   public Doenca procurar(OID id) throws DoencaNaoCadastradaException,
   PersistenceException
   {
     return this.repositorioDoenca.procurar(id);
   }

   /**
    * Retorna todas as doencas do banco
    *
    * @return List  <code>List</code>
    */
  public List getTodasDoencas() throws PersistenceException{
    return this.repositorioDoenca.getTodasDoencas();
  }

    /**
     * Retorna uma doenca com determinado nome
     *
     * @param nome    nome da doenca <code>String</code>
     * @return doenca procurada <code>Doenca</code>
     */
   public Doenca procurarPeloNome(String nome) throws
   DoencaNaoCadastradaException, PersistenceException
   {
     return this.repositorioDoenca.procurarPeloNome(nome);
   }

    /**
     * Retorna mais de uma doenca que comecam com um certo nome
     *
     * @param nome    nome da doenca <code>String</code>
     * @return doenca procurada <code>Doenca</code>
     */
    public List procurarPeloNomeParecido(String nome, int start, int size)
        throws PersistenceException{
     return this.repositorioDoenca.procurarPeloNomeParecido(nome, start, size);
   }
    /**
     * Retorna uma doenca com determinado cid
     *
     * @param cid    CID da doenca <code>CID</code>
     * @return doenca procurada <code>Doenca</code>
     */
   public Doenca procurarPeloCID(String cid)throws
   DoencaNaoCadastradaException, PersistenceException
   {
     return this.repositorioDoenca.procurarPeloCID(cid);
   }

   /**
    * Retorna mais de uma doenca dado a categoria do CID
    *
    * @param categoriaCID   Categoria do CID <code>String</code>
    * @return Lista de Doencas  <code>List</code>
    */
   public List procurarPelaCategoriaCID(String categoriaCID)
   {
     return this.repositorioDoenca.procurarPelaCategoriaCID(categoriaCID);
   }

   /**
    * Retorna mais de uma doenca dado a subcategoria do CID
    *
    * @param subcategoriaCID   Subcategoria do CID <code>String</code>
    * @return Lista de Doencas  <code>List</code>
    */
   public List procurarPelaSubcategoriaCID(String subcategoriaCID)
   {
     return this.repositorioDoenca.procurarPelaSubcategoriaCID(subcategoriaCID);
   }

   /**
    * Insere uma Doenca
    *
    * @param doenca   A doenca a ser inserida <code>Doenca</code>
    * @exception DoencaJaCadastradaException
    */
   public OID inserir(Doenca doenca) throws DoencaJaCadastradaException,
   PersistenceException
   {
     return this.repositorioDoenca.inserir(doenca);
   }

   /**
    * Remove uma Doenca
    *
    * @param doenca   A doenca a ser removida <code>Doenca</code>
    * @exception DoencaJaCadastradaException
    */
   public void remover(Doenca doenca) throws
   PersistenceException, DoencaNaoCadastradaException
   {
     this.repositorioDoenca.remover(doenca);
   }

   /**
    * Altera uma Doenca ja cadastrada
    *
    * @param doenca   A doenca a ser alterada <code>Doenca</code>
    * @exception DoencaNaoCadastradaException
    */
   public void alterar(Doenca doenca, Doenca newDoenca)
   throws DoencaNaoCadastradaException, PersistenceException
   {
     this.repositorioDoenca.alterar(doenca, newDoenca);
   }

    public static void main(String[] args) throws Exception {
      System.out.println("Inicio");
      DBDoenca db = new DBDoenca();
      CadastroDoenca cadastro = new CadastroDoenca(db);
      OIDFactory fabrica = OIDFactory.getInstancia();
      cadastro = new CadastroDoenca(DBDoenca.getInstancia());
      sac.fachada.SACFachada sacFachada = new sac.fachada.SACFachada();
//      Doenca doenca = new Doenca();
//      doenca.setCID("r.10");
//      doenca.setHereditariedade("_hereditariedade_1_");
//      doenca.setHistorico("_histórico_1_");
//      doenca.setNome("_nome_1_");
//      doenca.setOID(fabrica.novoOID());
//      doenca.setSintomas("_sintomas_1_");
//
//      Doenca doenca2 = new Doenca();
//      doenca2.setCID("r.20");
//      doenca2.setHereditariedade("_hereditariedade_2_");
//      doenca2.setHistorico("_histórico_2_");
//      doenca2.setNome("_nome_2_");
//      doenca2.setOID(fabrica.novoOID());
//      doenca2.setSintomas("_sintomas_2_");
//
//      cadastro.inserir(doenca);
//      System.out.println("======================\nInseriu Doenca 1\n======================");
//
//      cadastro.inserir(doenca2);
//      System.out.println("======================\nInseriu Doenca 2\n======================");
//
//      List listaDoencas = cadastro.getTodasDoencas();
//      Iterator iter = listaDoencas.iterator();
//      System.out.println("Imprimindo todas as doencas: ");
//      while (iter.hasNext()) {
//        Doenca item = (Doenca) iter.next();
//        item.print();
//      }

//      Doenca doencaprocurada = cadastro.procurarPeloNome("Nome_1");
//      if (doencaprocurada != null) {
//        System.out.println("Procurei pelo Nome: \"_nome_2_\"");
//        doencaprocurada.print();
//      }
      Doenca doencaprocurada;
      System.out.println("=================\n Procurando por nomes parecidos: ");
      List doencasProcuradas = cadastro.procurarPeloNomeParecido("Nome",10,10);
      for (int i = 0; i < doencasProcuradas.size(); i++) {
        doencaprocurada = (Doenca) doencasProcuradas.get(i);
        System.out.println("Doenca ["+i+"]: ");
        doencaprocurada.print();
      }

//      doencaprocurada = cadastro.procurarPeloCID("r.10");
//      if (doencaprocurada != null) {
//        System.out.println("Procurei pelo CID: \"r.10\"");
//        doencaprocurada.print();
//      }

      //Remoção
      //cadastro.remover(doencaprocurada);

      //Alteração
      /*
      Doenca doencaAlterada = doencaprocurada;
      doencaAlterada.setNome("_nome_novo");
      doencaAlterada.setHereditariedade("_hereditariedade_nova");
      doencaAlterada.setCID(new CID(30));
      cadastro.alterar(doencaprocurada,doencaAlterada);
      */

/*
      List lista = cadastro.procurarPorAcoesTerapeuticas("acoes terapeuticas");
      Iterator iter = lista.iterator();

      System.out.println("Lista: ");
      while(iter.hasNext()) {
        System.out.println("droga: " + droga);
      System.out.println("++++");

      }
      */
   }
}
