package sac.gui.bean;

import java.beans.*;
import java.util.List;
import java.util.LinkedList;
import java.util.Vector;
import sac.medicamento.Apresentacao;
import sac.medicamento.Laboratorio;
import sac.doenca.Doenca;
import sac.droga.Droga;
import sac.persistencia.OID;
import sac.exception.NullArgumentException;
//import sac.exception.NullArgumentException;

/**
 * Classe que representa elementos de um medicamento.
 *
 */
public class MedicamentoBean extends Object implements java.io.Serializable {

    //Identificador do medicamento
    private String id;
    //Nome do medicamento
    private String nome;
    //Lista de apresentaçoes
    private String apresentacao;
    //Laboratorio do medicamento
    private List laboratorios;
    //Contra-indicacoes do medicamento
    private String contraIndicacoes;
    //Indicacoes do medicamento
    private String indicacoes;
    //Droga principal na fabricacao do medicamento
    private DrogaBean drogaPrincipal;
    //Droga principal na fabricacao do medicamento
//    private long oidDrogaPrincipal;
    //Lista de drogas secundarias do medicamento
    private List drogasSecundarias;
    //    private long[] oidsDrogasSecundarias;
    //Lista de drogas secundarias do medicamento
//    private String[] drogasSecundarias;
    //Lista de doencas relacionadas ao medicamento
    private List doencasRelacionadas;
    //Preço de varejo
    private String precoVarejo;
    // Preço de atacado inferior
    private String precoAtacadoInferior;
    //Preço de atacado superior
    private String precoAtacadoSuperior;
    // mensagem de Erro
    private String mensagemErro;
    // List das drogas cadastradas
    private List drogas;
    // List das doencas cadastradas
    private List doencas;

    /**
     * Construtor vazio para Medicamento Comum.
     *
     */
    public MedicamentoBean() {
      this.id = null;
      this.nome = "";
      this.apresentacao = null;
      this.laboratorios = null;
      this.contraIndicacoes = "";
      this.indicacoes = "";
      this.drogaPrincipal = null;
      this.drogasSecundarias = null;
      this.doencasRelacionadas = null;
//      this.concentracao = "";
      this.precoVarejo = "";
      this.precoAtacadoInferior = "";
      this.precoAtacadoSuperior = "";
      this.mensagemErro = "";
      this.drogas = null;
      this.doencas = null;
    }

    /**
     * Construtor parametrizado para MedicamentoComumBean.
     *

    public MedicamentoBean(String id, String nome, List apresentacao,
    List laboratorios, String contraIndicacoes, String indicacoes, String drogaPrincipal,
    List drogasSecundarias, List doencasRelacionadas, //String concentracao,
    String precoVarejo, String precoAtacadoInferior, String precoAtacadoSuperior,
    String mensagemErro, List drogas, List doencas) {
        this.setId(id);
        setNome(nome);
        setApresentacao(apresentacao);
        setLaboratorios(laboratorios);
        setcontraIndicacoes(contraIndicacoes);
        setIndicacoes(indicacoes);
        setDrogaPrincipal(drogaPrincipal);
        setDrogasSecundarias(drogasSecundarias);
        setDoencasRelacionadas(doencasRelacionadas);
//        setConcentracao(concentracao);
        setPrecoVarejo(precoVarejo);
        setPrecoAtacadoInferior(precoAtacadoInferior);
        setPrecoAtacadoSuperior(precoAtacadoSuperior);
        setMensagemErro(mensagemErro);
        drogas = drogas;
        doencas = doencas;
    }
*/
   /**
    * Metodo que retorna o identificador do medicamento
    *
    * @return <code>OID</code> que representa o ID do medicamento
    */
    public String getId(){
      return id;
    }

   /**
    * Metodo que retorna o nome do medicamento
    *
    * @return <code>String</code> com o nome do medicamento
    */
    public String getNome(){
      return nome;
    }

   /**
    * Metodo que retorna as contra-indicacoes do medicamento
    *
    * @return <code>String</code> com as contra-indicacoes
    */
    public String getcontraIndicacoes(){
      return contraIndicacoes;
    }

   /**
    * Metodo que retorna as indicacoes do medicamento
    *
    * @return <code>String</code> com as indicacoes
    */
    public String getIndicacoes(){
      return indicacoes;
    }

   /**
    * Metodo que retorna a droga principal do medicamento
    *
    * @return Objeto <code>String</code> com a droga principal do medicamento
    */
    public DrogaBean getDrogaPrincipal(){
      return drogaPrincipal;
    }

   /**
    * Metodo que retorna o oid da droga principal do medicamento
    *
    * @return Objeto <code>int</code> com o oid da droga principal do medicamento

    public long getOIDDrogaPrincipal(){
      return this.oidDrogaPrincipal;
    }
*/
   /**
    * Metodo que retorna as drogas secundarias do medicamento
    *
    * @return Objeto <code>List</code> com as drogas secundarias
    */
    public List getDrogasSecundarias(){
      return drogasSecundarias;
    }

   /**
    * Metodo que retorna as drogas secundarias do medicamento
    *
    * @return Objeto <code>String</code> com as drogas secundarias

    public long[] getOIDsDrogasSecundarias(){
      return oidsDrogasSecundarias;
    }
*/
   /**
    * Metodo que retorna as apresentacoes do medicamento
    *
    * @return Objeto <code>String</code> com as apresentacoes do medicamento
    */
    public String getApresentacao(){
      return apresentacao;
    }

   /**
    * Metodo que retorna a concentraçao do medicamento
    *
    * @return <code>String</code> com a concentracao do medicamento

    public String getConcentracao(){
      return concentracao;
    }

   /**
    * Metodo que retorna as doencas relacionadas ao medicamento
    *
    * @return Objeto <code>String</code> com as doencas relacionadas ao medicamento
    */
    public List getDoencasRelacionadas(){
      return doencasRelacionadas;
    }

   /**
    * Metodo que retorna o laboratorio do medicamento
    *
    * @return Objeto <code>String</code> com os laboratorios fabricantes do medicamento
    */
    public List getLaboratorios(){
      return laboratorios;
    }

   /**
    * Metodo que retorna o preço de varejo do medicamento
    *
    * @return Objeto <code>long</code> com o preço de varejo do medicamento
    */
    public String getPrecoVarejo(){
      return precoVarejo;
    }

   /**
    * Metodo que retorna o preço de atacado inferior do medicamento
    *
    * @return Objeto <code>long</code> com o preço de atacado inferior do medicamento
    */
    public String getPrecoAtacadoInferior(){
      return precoAtacadoInferior;
    }

   /**
    * Metodo que retorna o preço de atacado superior do medicamento
    *
    * @return Objeto <code>long</code> com o preço de atacado superior do medicamento
    */
    public String getPrecoAtacadoSuperior(){
      return precoAtacadoSuperior;
    }

    //SET
   /**
    *  Metodo que altera a apresentacao do medicamento
    *
    * @param <code>String</code> Apresentacoes do medicamento
    */
    public void setApresentacao(List newApresentacao){
        String nomesApresentacao = "";
        if (newApresentacao != null) {
            for(int i=0; i<newApresentacao.size();i++) {
                String str = ((Apresentacao)newApresentacao.get(i)).getNome();
                nomesApresentacao = nomesApresentacao + str + "\n";
                System.out.println(" --- " + str);
            }
            this.apresentacao = nomesApresentacao;
        } else {
            this.apresentacao = "";
        }

    }

   /**
    *  Metodo que altera o concentracao do medicamento
    *
    * @param <code>String</code> com a concentracao do medicamento

    public void setConcentracao(String newConcentracao){
        this.concentracao = newConcentracao;
    }

   /**
    *  Metodo que altera as doencas relacionadas do medicamento
    *
    * @param <code>String</code> com as doencas relacionadas ao medicamento
    */
    public void setDoencasRelacionadas(List newDoencasRelacionados) throws NullArgumentException{

        List resp = null;
        DoencaBean doencaBean = null;
        if (newDoencasRelacionados != null) {
            resp = new LinkedList();
            System.out.println("Pegando "+newDoencasRelacionados.size()+" drogas ...");
            for (int i = 0; i < newDoencasRelacionados.size(); i++) {
                doencaBean = new DoencaBean((Doenca)newDoencasRelacionados.get(i));
                System.out.println("Doenca: " + doencaBean.getNome());
                resp.add(doencaBean);
            }
        }
        doencasRelacionadas = resp;

    }

/*        String[] nomesDoencas = null;
        if (newDoencasRelacionados != null) {
            nomesDoencas = new String[newDoencasRelacionados.size()];
            for(int i=0; i<newDoencasRelacionados.size();i++) {
                System.out.println(" BEAN - Pegando nomes doencas:");
                String str = ((Doenca)newDoencasRelacionados.get(i)).getNome();
                nomesDoencas[i] = str;
                System.out.println(" --- " + str);
            }
        } else {
//            this.doencasRelacionadas = new String[1];
//            this.doencasRelacionadas[0] = "";
        }
        this.doencasRelacionadas = nomesDoencas;
    }
*/
   /**
    *  Metodo que altera o ID do medicamento
    *
    * @param <code>OID</code> ID do medicamento
    */
    public void setId(String newId){
        	this.id = newId;
    }

   /**
    *  Metodo que altera o nome do medicamento
    *
    * @param <code>String</code> com o nome do medicamento
    */
    public void setNome(String newNome) {
        this.nome = newNome;
    }

   /**
    *  Metodo que altera as contra-indicacoes do medicamento
    *
    * @param <code>String</code> com as novas contra-indicacoes do medicamento
    */
    public void setcontraIndicacoes(String newcontraIndicacoes){
        this.contraIndicacoes = newcontraIndicacoes;
    }

   /**
    *  Metodo que altera as indicacoes do medicamento
    *
    * @param <code>String</code> com as novas indicacoes do medicamento
    */
    public void setIndicacoes(String newIndicacoes){
        this.indicacoes = newIndicacoes;
    }

   /**
    *  Metodo que altera a droga principal do medicamento
    *
    * @param Objeto <code>String</code> com a droga principal do medicamento

    public void setDrogaPrincipal(String newDrogaPrincipal){
        this.drogaPrincipal = newDrogaPrincipal;
    }
*/
   /**
    *  Metodo que altera a droga principal do medicamento
    *
    * @param Objeto <code>String</code> com a droga principal do medicamento
    */
    public void setDrogaPrincipal(DrogaBean newDrogaPrincipal){
        this.drogaPrincipal = newDrogaPrincipal;
    }

   /**
    *  Metodo que altera as drogas secundarias do medicamento
    *
    * @param <code>List</code> com as drogas secundarias
    * do medicamento
    *
    * @exception NomeInvalidoException Invalida nome com string vazia
    */
    public void setDrogasSecundarias(List newDrogasSecundaria) throws NullArgumentException{

        List resp = null;
        DrogaBean drogaBean = null;
        if (newDrogasSecundaria != null) {
            resp = new LinkedList();
            System.out.println("Pegando "+newDrogasSecundaria.size()+" drogas ...");
            for (int i = 0; i < newDrogasSecundaria.size(); i++) {
                drogaBean = new DrogaBean((Droga)newDrogasSecundaria.get(i));
                System.out.println("Droga: " + drogaBean.getNome());
                resp.add(drogaBean);
            }
        }
        drogasSecundarias = resp;
    }

/*        String[] nomesDrogas = null;
        long[] oidsDrogas = null;
        if (newDrogasSecundaria != null) {
            nomesDrogas = new String[newDrogasSecundaria.size()];
            oidsDrogas = new long[newDrogasSecundaria.size()];
            for(int i=0; i < newDrogasSecundaria.size();i++) {
                System.out.println(" BEAN - Pegando nomes drogas:");
                String str = ((Droga) newDrogasSecundaria.get(i)).getNome();
                long oid = ((Droga)newDrogasSecundaria.get(i)).getID().getLongValue();
                oidsDrogas[i] = oid;
                nomesDrogas[i] = str;
                System.out.println(" --- " + str);
            }

        } else {
        }
        this.drogasSecundarias = nomesDrogas;
        this.oidsDrogasSecundarias =

    }
*/
   /**
    *  Metodo que altera as drogas secundarias do medicamento
    *
    * @param <code>String</code> com as drogas secundarias
    * do medicamento
    *
    * @exception NomeInvalidoException Invalida nome com string vazia

    public void setOIDsDrogasSecundarias(List newDrogasSecundaria){
        long[] oidsDrogas = null;
        if (newDrogasSecundaria != null) {
            oidsDrogas = new long[newDrogasSecundaria.size()];
            for(int i=0; i < newDrogasSecundaria.size();i++) {
                System.out.println(" BEAN - Pegando oids drogas:");
                long oid = ((Droga)newDrogasSecundaria.get(i)).getID().getLongValue();
                oidsDrogas[i] = oid;
                System.out.println(" --- " + oid);
            }

        } else {
//            this.drogasSecundarias = new String[1];
//            this.drogasSecundarias[0] = "";
        }
        this.oidsDrogasSecundarias = oidsDrogas;
    }
*/
   /**
    *  Metodo que altera os laboratorios do medicamento
    *
    * @param Objeto <code>String</code> com os laboratorios do medicamento
    */
    public void setLaboratorios (List newLaboratorios) {
       laboratorios = newLaboratorios;
    /*        String nomesLaboratorios = "";
        if (newLaboratorios != null) {
            for(int i=0; i<newLaboratorios.size();i++) {
                String str = ((Laboratorio)newLaboratorios.get(i)).getNome();
                nomesLaboratorios = nomesLaboratorios + str + "\n";
                System.out.println(" --- " + str);
            }
            this.laboratorios = nomesLaboratorios;
        } else {
            this.laboratorios = "";
        }
*/
    }

   /**
    * Metodo que altera o preço de varejo do medicamento
    *
    * @param Objeto <code>long</code> com o preço de varejo do medicamento
    */
    public void setPrecoVarejo(String newPrecoVarejo){
      this.precoVarejo = newPrecoVarejo;
    }

   /**
    * Metodo que altera o preço de atacado inferior do medicamento
    *
    * @param Objeto <code>long</code> com o preço de atacado inferior do medicamento
    */
    public void setPrecoAtacadoInferior(String newPrecoAtacadoInferior){
      this.precoAtacadoInferior = newPrecoAtacadoInferior;
    }

   /**
    * Metodo que altera o preço de atacado superior do medicamento
    *
    * @param Objeto <code>long</code> com o preço de atacado superior do medicamento
    */
    public void setPrecoAtacadoSuperior(String newPrecoAtacadoSuperior){
      this.precoAtacadoSuperior = newPrecoAtacadoSuperior;
    }

    public void setMensagemErro(String mensagemErro) {
        this.mensagemErro = mensagemErro;
    }

    public String getMensagemErro() {
        return this.mensagemErro;
    }

    public void setDrogas(List drogas){
        this.drogas = drogas;
    }

    public void setDoencas(List doencas){
        this.doencas = doencas;
    }

    public List getDrogas(){
        return this.drogas;
    }

    public List getDoencas(){
        return this.doencas;
    }

    public void validaBean() throws CampoInvalidoException{
        StringBuffer mensagem = new StringBuffer("O(s) campo(s) ");
        boolean erro = false;

        if(nome.equals("")) {
            mensagem.append("NOME ");
            erro = true;
        }
        if(apresentacao.equals("")) {
            mensagem.append("APRESENTACAO ");
            erro = true;
        }
        if (laboratorios.size() == 0 || laboratorios == null) {
            mensagem.append("LABORATORIOS ");
            erro = true;
        }
        if(indicacoes.equals("")) {
            mensagem.append("INDICAÇÕES ");
            erro = true;
        }
        if(contraIndicacoes.equals("")){
            mensagem.append("CONTRA INDICAÇÇOES ");
            erro = true;
        }
        if((drogaPrincipal.getOID().equals("")) && (drogaPrincipal.getNome().equals(""))){
            mensagem.append("DROGA PRINCIPAL ");
            erro = true;
        }
        if(drogasSecundarias == null) {
            mensagem.append("DROGAS SECUNDARIAS ");
            erro = true;
        }
        if(doencasRelacionadas == null) {
            mensagem.append("DOENCAS RELACIONADAS ");
            erro = true;
        }
/*        if(precoVarejo.equals("")) {
            mensagem.append("PRECO VAREJO ");
            erro = true;
        }
        if(precoAtacadoInferior.equals("")) {
            mensagem.append("PRECO ATACADO INFERIOR ");
            erro = true;
        }
        if(precoAtacadoSuperior.equals("")) {
            mensagem.append("PRECO ATACADO SUPERIOR ");
            erro = true;
        }
*/        if(erro) {
            mensagem.append("deve(m) ser preenchido(s).");
            this.mensagemErro = mensagem.toString();
            System.out.println(mensagemErro);
            throw new CampoInvalidoException(mensagemErro);
        }
    }

/*    public Medicamento getMedicamento () (

        medicamento = new Medicamento();
        medicamento.setNome(nome);
        medicamento.setApresentacao();
        medicamento.setLaboratorios(getApresentacao(request));
        medicamento.setDrogaPrincipal(fachada.procurarDrogaPeloNome(request.getParameter(DROGA_PRINCIPAL_INPUT)));
        medicamento.setDrogasSecundarias(getDrogas(request, fachada));
        medicamento.setDoencasRelacionadas(getDoencas(request, fachada));
        medicamento.setIndicacoes(request.getParameter(INDICACOES_INPUT));
        medicamento.setcontraIndicacoes(request.getParameter(CONTRA_INDICACOES_INPUT));
        medicamento.setPrecoVarejo(Long.parseLong(request.getParameter(PRECO_VAREJO_INPUT)));
        medicamento.setPrecoAtacadoInferior(Long.parseLong(request.getParameter(PRECO_ATACADO_INFERIOR_INPUT)));
        medicamento.setPrecoAtacadoSuperior(Long.parseLong(request.getParameter(PRECO_ATACADO_SUPERIOR_INPUT)));

        return medicamento;
    }

     public List getApresentacao(HttpServletRequest request) throws NullArgumentException{
            List resp = new Vector();
        	  Apresentacao apresObj = null;
            String apres = request.getParameter(APRESENTACAO_INPUT);
            if (apres!=null) {
                StringTokenizer str = new StringTokenizer(apres, "\n");
                System.out.println("Pegando "+ str.countTokens() +" apresentacoes ...");
                while (str.hasMoreElements()) {
//                for (int i = 0; i < apres.length; i++) {
                    apresObj = new Apresentacao();
                    apresObj.setNome((String) str.nextElement());
                    System.out.println("Apresentacao: " + apresObj.getNome());
                    resp.add(apresObj);
                }
            }
            return resp;
        }

      public List getLaboratorios(HttpServletRequest request) throws NullArgumentException{
            List resp = new Vector();
        	Laboratorio labObj = null;
            String labs = request.getParameter(LABORATORIOS_INPUT);
            if (labs!=null) {
                StringTokenizer str = new StringTokenizer(labs, "\n");
                System.out.println("Pegando " + str.countTokens() + " laboratorios ...");
//                for (int i = 0; i < labs.length; i++) {
                while (str.hasMoreElements()) {
                    labObj = new Laboratorio();
                    labObj.setNome((String) str.nextElement());
                    System.out.println("Laboratorio: " + labObj.getNome());
                    resp.add(labObj);
                }
            }
            return resp;
        }
*/
}
