package sac.medicamento;

import sac.persistencia.OID;
import java.util.List;
import java.util.Iterator;
import sac.droga.Droga;
import sac.exception.NullArgumentException;
import sac.doenca.Doenca;


public class Medicamento
{
   //Identificador do medicamento
   private OID id;
   //Nome do medicamento
   private String nome;
   //Lista de apresentaçoes
   private List 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 Droga drogaPrincipal;
   //Lista de drogas secundarias do medicamento
   private List drogasSecundarias;
   //Lista de doencas relacionadas ao medicamento
   private List doencasRelacionadas;
   //Concentracao do medicamento
   //private String concentracao;
   //Preço de varejo
   private double precoVarejo;
   // Preço de atacado inferior
   private double precoAtacadoInferior;
   //Preço de atacado superior
   private double precoAtacadoSuperior;

    /**
      * Construtor <code>Medicamento</code>
      */
    public Medicamento () {
        id = null;
        nome = "";
        apresentacao = null;
        laboratorios = null;
 //       concentracao = "";
        indicacoes = "";
        contraIndicacoes = "";
        drogaPrincipal = null;
        drogasSecundarias = null;
        doencasRelacionadas = null;
        precoAtacadoInferior = 0;
        precoAtacadoSuperior = 0;
        precoVarejo = 0;
    }

   /**
    * Construtor <code>Medicamento</code>
    *
    * @param _id <code>OID</code> que identifica o medicamento
    * @param _nome <code>String</code> que identifica o nome do medicamento
    * @param _laboratorio Ojbeto <code>Laboratorio</code> que identifica o
    *         laboratorio do medicamento
    *
    * @exception NomeInvalidoException Invalida nome com string vazia
    * @exception NullArgumentException Invalida objeto <code>null</code>
    */
    public Medicamento(OID _id, String _nome, List _laboratorios) throws
        NullArgumentException {
        this.id = _id;
        if (!(_nome.equals(""))) {
            this.nome = _nome;
        } else {
            throw new NullArgumentException ("Nome vazio");
        }
        if (_laboratorios != null) {
            this.laboratorios = _laboratorios;
        } else {
            throw new NullArgumentException ("Objeto Laboratorio Nulo!");
        }
//        concentracao = "";
        indicacoes = "";
        contraIndicacoes = "";
        drogaPrincipal = null;
        drogasSecundarias = null;
        doencasRelacionadas = null;
        precoAtacadoInferior = 0;
        precoAtacadoSuperior = 0;
        precoVarejo = 0;
    }

   /**
    * Metodo que retorna o identificador do medicamento
    *
    * @return <code>OID</code> que representa o ID do medicamento
    */
    public OID 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>Droga</code> com a droga principal do medicamento
    */
    public Droga getDrogaPrincipal(){
      return drogaPrincipal;
    }

   /**
    * 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 apresentacoes do medicamento
    *
    * @return Objeto <code>List</code> com as apresentacoes do medicamento
    */
    public List 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>List</code> com as doencas relacionadas ao medicamento
    */
    public List getDoencasRelacionadas(){
      return doencasRelacionadas;
    }

   /**
    * Metodo que retorna o laboratorio do medicamento
    *
    * @return Objeto <code>List</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>double</code> com o preço de varejo do medicamento
    */
    public double getPrecoVarejo(){
      return precoVarejo;
    }

   /**
    * Metodo que retorna o preço de atacado inferior do medicamento
    *
    * @return Objeto <code>double</code> com o preço de atacado inferior do medicamento
    */
    public double getPrecoAtacadoInferior(){
      return precoAtacadoInferior;
    }

   /**
    * Metodo que retorna o preço de atacado superior do medicamento
    *
    * @return Objeto <code>double</code> com o preço de atacado superior do medicamento
    */
    public double getPrecoAtacadoSuperior(){
      return precoAtacadoSuperior;
    }

    //SET
   /**
    *  Metodo que altera a apresentacao do medicamento
    *
    * @param <code>List</code> Apresentacoes do medicamento
    */
    public void setApresentacao(List newApresentacao){
        this.apresentacao = newApresentacao;
    }

   /**
    *  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>List</code> com as doencas relacionadas ao medicamento
    */
    public void setDoencasRelacionadas(List newDoencasRelacionados){
        this.doencasRelacionadas = newDoencasRelacionados;
    }

   /**
    *  Metodo que altera o ID do medicamento
    *
    * @param <code>OID</code> ID do medicamento
    *
    * @exception NullArgumentException - Excecao levantada quando o OID for
    *                                    objeto nulo
    */
    public void setId(OID newId) throws NullArgumentException{
    	if (newId == null) {
    	    throw new NullArgumentException("newId == null");
    	} else {
        	this.id = newId;
        }
    }

   /**
    *  Metodo que altera o nome do medicamento
    *
    * @param <code>String</code> com o nome do medicamento
    *
    * @exception NomeInvalidoException Invalida nome com string vazia
    */
    public void setNome(String newNome) throws NullArgumentException{
        if (newNome == null) {
            throw new NullArgumentException("newNome == null");
        }
        if (newNome.equals("")) {
            throw new IllegalArgumentException("newNome.equals(\"\")");
        }
        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>Droga</code> com a droga principal do medicamento
    */
    public void setDrogaPrincipal(Droga 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){
        this.drogasSecundarias = newDrogasSecundaria;
    }

   /**
    *  Metodo que altera os laboratorios do medicamento
    *
    * @param Objeto <code>List</code> com os laboratorios do medicamento
    *
    * @exception NullArgumentException Invalida objeto List nulo
    */
    public void setLaboratorios (List newLaboratorios) throws
    NullArgumentException{
        if (newLaboratorios!= null) {
            this.laboratorios = newLaboratorios;
        } else {
            throw new NullArgumentException ("Objeto List de laboratorios nulo!");
        }
    }

   /**
    * Metodo que altera o preço de varejo do medicamento
    *
    * @param Objeto <code>double</code> com o preço de varejo do medicamento
    */
    public void setPrecoVarejo(double newPrecoVarejo){
      this.precoVarejo = newPrecoVarejo;
    }

   /**
    * Metodo que altera o preço de atacado inferior do medicamento
    *
    * @param Objeto <code>double</code> com o preço de atacado inferior do medicamento
    */
    public void setPrecoAtacadoInferior(double newPrecoAtacadoInferior){
      this.precoAtacadoInferior = newPrecoAtacadoInferior;
    }

   /**
    * Metodo que altera o preço de atacado superior do medicamento
    *
    * @param Objeto <code>double</code> com o preço de atacado superior do medicamento
    */
    public void setPrecoAtacadoSuperior(double newPrecoAtacadoSuperior){
      this.precoAtacadoSuperior = newPrecoAtacadoSuperior;
    }

   /**
    *  Metodo que compara dois medicamentos
    *
    * @param Objeto <code>Medicamento</code> a ser comparado ao atual
    *
    * @exception NullArgumentException Invalida objeto Medicamento nulo
    */
    public boolean equals (Medicamento _medicamento) throws
    NullArgumentException {
        boolean teste = false;
        if (_medicamento != null) {
            teste = this.nome.equals(_medicamento.getNome()) &&
                    this.apresentacao.equals(_medicamento.getApresentacao()) &&
   //                 this.concentracao.equals(_medicamento.getConcentracao()) &&
                    this.laboratorios.equals(_medicamento.getLaboratorios());
        } else {
            throw new NullArgumentException ("Objeto Medicamento Nulo!");
        }
        return teste;
    }

    public String listar(){
        String aux = "", drogaP = "";
        aux = "Nome: " + nome + "\nLaboratorios: ";
        if (laboratorios != null) {
            Iterator iter = laboratorios.iterator();
            while (iter.hasNext()) {
                aux = aux + "\n  " + ((Laboratorio) iter.next()).getNome();
            }
        }
        aux = aux + "\nApresentacao: ";
        if (apresentacao!= null) {
            Iterator iter2 = apresentacao.iterator();
            while (iter2.hasNext()) {
                aux = aux + "\n  " + ((Apresentacao) iter2.next()).getNome();
            }
        }
        aux = aux + //"\nConcentracao: " + concentracao +
                    "\nIndicacoes: " + indicacoes +
                    "\nContra-indicacoes: " + contraIndicacoes +
                    "\nDroga Principal: ";
        if (drogaPrincipal == null) {
            drogaP = "";
        } else {
            drogaP = drogaPrincipal.getNome();
        }
        aux = aux + drogaP + "\nDrogas Secundarias: ";
        if (drogasSecundarias != null) {
            Iterator iter3 =  drogasSecundarias.iterator();
            while (iter3.hasNext()) {
                aux = aux + "\n  " + ((Droga) iter3.next()).getNome();
            }
        }
        aux = aux + "\nDoencas Relacionadas: ";
        if (doencasRelacionadas != null) {
            Iterator iter4 =  doencasRelacionadas.iterator();
            while (iter4.hasNext()) {
                aux = aux + "\n  " + ((Doenca) iter4.next()).getNome();
            }
        }
        aux = aux + "\nPreco Varejo: " + precoVarejo +
                    "\nPreco Atacado Inferior: " + precoAtacadoInferior +
                    "\nPreco Atacado Superior: " + precoAtacadoSuperior;
        return aux;
    }
}
