package sac.gui.bean;

import javax.servlet.http.HttpServletRequest;

import sac.droga.Droga;
import sac.persistencia.OID;
import sac.exception.NullArgumentException;

import java.beans.*;

/**
 * Classe que representa elementos de uma droga.
 *
 */
public class DrogaBean extends Object implements java.io.Serializable {
    public static final String INPUT_OID = "oid";
    public static final String INPUT_NOME = "nome";
    public static final String INPUT_ACOES_TERAPEUTICAS = "acoesTerapeuticas";
    public static final String INPUT_PROPRIEDADES = "propriedades";
    public static final String INPUT_DOSAGEM = "dosagem";
    public static final String INPUT_INDICACOES = "indicacoes";
    public static final String INPUT_CONTRA_INDICACOES = "contraIndicacoes";
    public static final String INPUT_REACOES_ADVERSAS = "reacoesAdversas";
    public static final String INPUT_PRECAUCOES = "precaucoes";
    public static final String INPUT_INTERACOES = "interacoes";

    // oid da droga
    private String oid;
    // nome da droga
    private String nome;
    // acoes terapeuticas da droga
    private String acoesTerapeuticas;
    // propriedades da droga
    private String propriedades;
    // dosagem da droga
    private String dosagem;
    // indicacoes da droga
    private String indicacoes;
    // contra-indicacoes da droga
    private String contraIndicacoes;
    // reacoes adversas da droga
    private String reacoesAdversas;
    // precaucoes da droga
    private String precaucoes;
    // interacoes da droga
    private String interacoes;
    // mensagem de Erro
    private String mensagemErro;

    /**
     * Construtor vazio para Droga Comum.
     *
     */
    public DrogaBean() {
      oid = "";
      nome = "";
      acoesTerapeuticas = "";
      propriedades = "";
      dosagem = "";
      indicacoes = "";
      contraIndicacoes = "";
      reacoesAdversas = "";
      precaucoes = "";
      interacoes = "";
      mensagemErro = "";
    }

    /**
     * Construtor parametrizado para DrogaComumBean.
     *
     */
    public DrogaBean(Droga droga) {
        setOID("" +droga.getID().getLongValue());
        setNome(droga.getNome());
        setAcoesTerapeuticas(droga.getAcoesTerapeuticas());
        setPropriedades(droga.getPropriedades());
        setDosagem(droga.getDosagem());
        setIndicacoes(droga.getIndicacoes());
        setContraIndicacoes(droga.getContraIndicacoes());
        setReacoesAdversas(droga.getReacoesAdversas());
        setPrecaucoes(droga.getPrecaucoes());
        setInteracoes(droga.getInteracoes());
    }

    public DrogaBean(HttpServletRequest request) {
        setNome(request.getParameter(INPUT_NOME));
        setAcoesTerapeuticas(request.getParameter(INPUT_ACOES_TERAPEUTICAS));
        setPropriedades(request.getParameter(INPUT_PROPRIEDADES));
        setDosagem(request.getParameter(INPUT_DOSAGEM));
        setIndicacoes(request.getParameter(INPUT_INDICACOES));
        setContraIndicacoes(request.getParameter(INPUT_CONTRA_INDICACOES));
        setReacoesAdversas(request.getParameter(INPUT_REACOES_ADVERSAS));
        setPrecaucoes(request.getParameter(INPUT_PRECAUCOES));
        setInteracoes(request.getParameter(INPUT_INTERACOES));

        String oid = request.getParameter(INPUT_OID);
        if(oid != null) {
            setOID(oid);
        } else {
            setOID("");
        }
    }

    /**
     * Método que retorna o oid da droga.
     *
     * @return oid		String contendo oid da droga.
     */
    public String getOID() {
        return this.oid;
    }

    /**
     * Método que configura o oid da droga.
     *
     * @param oid	String contendo novo oid da Droga.
     */
    public void setOID(String oid) {
        this.oid = oid;
    }

    /**
     * Método que retorna o nome da droga.
     *
     * @return nome		String contendo nome da droga.
     */
    public String getNome() {
        return this.nome;
    }

    /**
     * Método que configura o nome da droga.
     *
     * @param nome	String contendo novo nome da Droga.
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * Método que retorna as AcoesTerapeuticas da droga.
     *
     * @return acoesTerapeuticas	String contendo as AcoesTerapeuticas da droga.
     */
    public String getAcoesTerapeuticas() {
        return this.acoesTerapeuticas;
    }

    /**
     * Método que configura as acoesTerapeuticas da droga.
     *
     * @param acoesTerapeuticas		String contendo novas acoesTerapeuticas.
     */
    public void setAcoesTerapeuticas(String acoesTerapeuticas) {
        this.acoesTerapeuticas = acoesTerapeuticas;
    }

    /**
     * Método que retorna as propriedades da droga.
     *
     * @return propriedades	String contendo as propriedades da droga.
     */
    public String getPropriedades() {
        return this.propriedades;
    }

    /**
     * Método que configura as propriedades da droga.
     *
     * @param propriedades		String contendo as novas propriedades da droga.
     */
    public void setPropriedades(String propriedades) {
        this.propriedades = propriedades;
    }

    /**
     * Método que retorna a dosagem da droga.
     *
     * @return dosagem	String contendo a dosagem da droga.
     */
    public String getDosagem() {
        return this.dosagem;
    }

    /**
     * Método que configura  a dosagem da droga.
     *
     * @param dosagem	String contendo a nova dosagem da droga.
     */
    public void setDosagem(String dosagem) {
        this.dosagem = dosagem;
    }

    /**
     * Método que retorna as indicacoes da droga.
     *
     * @return indicacoes	String contendo as indicacoes da droga.
     */
    public String getIndicacoes() {
        return this.indicacoes;
    }

    /**
     * Método que configura as indicacoes da droga.
     *
     * @param indicacoes	String contendo as novas indicacoes da droga.
     */
    public void setIndicacoes(String indicacoes) {
        this.indicacoes = indicacoes;
    }

    /**
     * Método que retorna as Contra-indicacoes da droga.
     *
     * @return contraIndicacoes	  String contendo as Contra-indicacoes da droga.
     */
    public String getContraIndicacoes() {
        return this.contraIndicacoes;
    }

    /**
     * Método que configura as contra-indicacoes da droga.
     *
     * @param contraIndicacoes	String contendo as novas contraindicadoes da droga.
     */
    public void setContraIndicacoes(String contraIndicacoes) {
        this.contraIndicacoes = contraIndicacoes;
    }

    /**
     * Método que retorna as Reacoes Adversas da droga.
     *
     * @return reacoesAdversas	String contendo as reacoesAdversas da droga.
     */
    public String getReacoesAdversas() {
        return this.reacoesAdversas;
    }

    /**
     * Método que configura as reacoesAdversas da droga.
     *
     * @param reacoesAdversas	String contendo as novas reacoes adversas da droga.
     */
    public void setReacoesAdversas(String reacoesAdversas) {
        this.reacoesAdversas = reacoesAdversas;
    }

    /**
     * Método que retorna as precaucoes da droga.
     *
     * @return precaucoes	String contendo as precaucoes da droga.
     */
    public String getPrecaucoes() {
        return this.precaucoes;
    }

    /**
     * Método que configura as precaucoes da droga.
     *
     * @param precaucoes	String contendo as precaucoes da droga.
     */
    public void setPrecaucoes(String precaucoes) {
        this.precaucoes = precaucoes;
    }

    /**
     * Método que retorna as Interacoes da droga.
     *
     * @return interacoes	String contendo as Interacoes da droga.
     */
    public String getInteracoes() {
        return this.interacoes;
    }

    /**
     * Método que configura as interacoes da droga.
     *
     * @param interacoes	Strinf contendo as interacoes da droga.
     */
    public void setInteracoes(String interacoes) {
        this.interacoes = interacoes;
    }

    public void setMensagemErro(String mensagemErro) {
        this.mensagemErro = mensagemErro;
    }

    public String getMensagemErro() {
        return this.mensagemErro;
    }

    public void validaBean() throws CampoInvalidoException {
        StringBuffer mensagem = new StringBuffer();
        boolean erro = false;

        mensagem.append("O(s) campo(s) ");
        if(nome == null || nome.equals("")) {
            mensagem.append("Nome ");
            erro = true;
        }
        if(acoesTerapeuticas == null || acoesTerapeuticas.equals("")) {
            mensagem.append("Ações Terapeuticas ");
            erro = true;
        }
        if(propriedades == null || propriedades.equals("")) {
            mensagem.append("Propriedades ");
            erro = true;
        }
        if(dosagem == null || dosagem.equals("")) {
            mensagem.append("Dosagem ");
            erro = true;
        }
        if(indicacoes == null || indicacoes.equals("")) {
            mensagem.append("Indicações ");
            erro = true;
        }
        if(contraIndicacoes == null || contraIndicacoes.equals("")) {
            mensagem.append("Contra Indicações ");
            erro = true;
        }
        if(reacoesAdversas == null || reacoesAdversas.equals("")) {
            mensagem.append("Reações Adversas");
            erro = true;
        }
        if(precaucoes == null || precaucoes.equals("")) {
            mensagem.append("Precauções ");
            erro = true;
        }
        if(interacoes == null || interacoes.equals("")) {
            mensagem.append("Interações ");
            erro = true;
        }
        if(erro) {
            mensagem.append("deve(m) ser preenchido(s).");
            mensagemErro = mensagem.toString();
            throw new CampoInvalidoException(mensagemErro);
        }
    }

    public Droga getDroga() throws NullArgumentException {
        Droga droga = new Droga();

        droga.setNome(nome);
        droga.setAcoesTerapeuticas(acoesTerapeuticas);
        droga.setPropriedades(propriedades);
        droga.setDosagem(dosagem);
        droga.setIndicacoes(indicacoes);
        droga.setContraIndicacoes(contraIndicacoes);
        droga.setReacoesAdversas(reacoesAdversas);
        droga.setPrecaucoes(precaucoes);
        droga.setInteracoes(interacoes);

        if(!oid.equals("")) {
            droga.setID(new OID(Long.parseLong(oid)));
        }
        return droga;
    }
}