package sac.pessoa.fisica;

/**
 * Projeto: SAC
 *
 * Tipo: PessoaFisica
 *
 */

import java.util.List;
import java.util.ArrayList;

import sac.exception.NullArgumentException;
import sac.exception.InvalidArgumentException;
import sac.pessoa.SenhaInvalidaException;
import sac.pessoa.UsuarioComum;
import sac.pessoa.util.HandlerString;
import sac.pessoa.util.HandlerCPF;
import sac.pessoa.endereco.Endereco;




public class PessoaFisica extends UsuarioComum
{
   private byte curriculum[];
   private List tiposServicos;
   private List doencas;
   private String cpf;
   private Endereco endereco;
   private String descricaoAtividades;

   private HandlerString verificadorCPF = new HandlerCPF();

   /**
    * Construtor da Classe Pessoa Fisica
    *
    * @param nome   Nome da Pessoa fisica
    * @param cpf    CPF da Pessoa fisica
    * @param senha  Senha da Pessoa fisica
    *
   */
   public PessoaFisica(String nome, String cpf, String senha, Endereco endereco,
        List doencas ) throws CPFInvalidoException, SenhaInvalidaException, NullArgumentException, InvalidArgumentException {
	  super(nome, cpf, senha, UsuarioComum.STATUS_PESSOA_FISICA);
	  setCpf(cpf);
          setEndereco(endereco);
          setDoencas(doencas);

          setTiposServicos(new ArrayList());
          setDescricaoAtividades("");
   }
   /**
	* Metodo que recupera cpf da pessoa fisica
	*
	* @return String  cpf da pessoa fisica
	*
   */
   public String getCpf()
   {
	  return this.cpf;
   }
   /**
	* Metodo que recupera curr~iculo da pessoa fisica
	*
	* @return byte[]  currículo da pessoa fisica
	*
   */
   public byte[] getCurriculo()
   {
	  return this.curriculum;
   }
   /**
	* Metodo que recupera descrição de atividades da pessoa fisica
	*
	* @return DescricaoAtividades  Atividades da pessoa fisica
	*
   */
   public String getDescricaoAtividades()
   {
	  return this.descricaoAtividades;
   }
   /**
	* Metodo que recupera doenças da pessoa fisica
	*
	* @return Doencas  Lista de doenças da pessoa fisica
	*
   */
   public List getDoencas()
   {
	  return this.doencas;
   }
   /**
	* Metodo que recupera endereco da pessoa fisica
	*
	* @return endereco  endereco da pessoa fisica
	*
   */
   public Endereco getEndereco()
   {
	  return this.endereco;
   }
   /**
	* Metodo que recupera Tipos de Serviços da pessoa fisica
	*
	* @return TiposSErvicos  Tipos de Serviço da pessoa fisica
	*
   */
   public List getTiposServicos()
   {
	  return this.tiposServicos;
   }
   /**
	* Metodo que altera cpf da pessoa fisica
	*
	* @param newCpf  novo cpf da pessoa fisica
	*
   */
   public void setCpf(String newCpf)  throws CPFInvalidoException, NullArgumentException {
      if ( newCpf == null){
          throw new NullArgumentException ("valor do cpf nulo.");
      } else if (verificadorCPF.valida(newCpf)) {
          this.cpf = newCpf;
      } else {
          throw new CPFInvalidoException("Valor do cpf inválido, cpf = "+ newCpf+".");
      }
   }
   /**
	* Metodo que altera currículo da pessoa fisica
	*
	* @param newCurriculo  Array de bytes com o novo cuurilo da pessoa física
	*
   */
   public void setCurriculo(byte[] newCurriculo) throws NullArgumentException {
      if (curriculum == null || curriculum.length < Math.pow(2, 128)){
          this.curriculum = newCurriculo;
      } else {
          throw new NullArgumentException("Tamanho do arquivo de curriculum maior que o permitido, tamanho = "+ newCurriculo.length+".");
      }

   }
   /**
	* Metodo que altera decrição de atividades da pessoa fisica
	*
	* @param newDescricaoAtividades  novo descricao de atividades da pessoa fisica
	*
   */
   public void setDescricaoAtividades(String newDescricaoAtividades){
        if ( newDescricaoAtividades == null) {
	  this.descricaoAtividades = "";
        } else {
	  this.descricaoAtividades = newDescricaoAtividades;
        }
   }
   /**
	* Metodo que altera doenças da pessoa fisica
	*
	* @param newDoenças  novas doenças da pessoa fisica
	*
   */
    public void setDoencas(List newDoencas) throws NullArgumentException{
        if (newDoencas == null){
	   this.doencas = new ArrayList();
        } else {
	   this.doencas = newDoencas;
        }
    }
   /**
	* Metodo que altera endereco da pessoa fisica
	*
	* @param newEndereco  novo endereco da pessoa fisica
	*
   */
    public void setEndereco(Endereco newEndereco) throws NullArgumentException{
        if ( newEndereco != null){
	    this.endereco = newEndereco;
        } else {
            throw new NullArgumentException ("Endereco nulo.");
        }
    }
   /**
	* Metodo que altera tipos de serviço da pessoa fisica
	*
	* @param newTiposServicoa  novo servicos da pessoa fisica
	*
   */
   public void setTiposServicos(List newTiposServicos) {
      if ( newTiposServicos == null){
        this.tiposServicos = new ArrayList();
      } else {
        this.tiposServicos = newTiposServicos;
      }
   }

   public String toString(){
      StringBuffer sb = new StringBuffer();
      sb.append("Nome: "+getNome().trim() + "\t");
      sb.append("Cpf: "+ getCpf().trim() + "\t");
      sb.append("Senha: "+getSenha().trim() + "\t");
      sb.append("Descricao: "+ getDescricaoAtividades().trim() + "\t");
      sb.append("\n");
      sb.append("Endereco : "+ getEndereco().toString() );
      sb.append("\n");
      List tiposervico = getTiposServicos();
      sb.append("Tipos de servico : ");
      for (int i = 0; i < tiposervico.size(); i++) {
        sb.append(tiposervico.get(i).toString().trim() +  "\t");
      }
      sb.append("\n");
      List downcas = getDoencas();
      sb.append("Doencas : ");
      for (int i = 0; i < downcas.size(); i++) {
        sb.append(downcas.get(i).toString().trim() +  "\t");
      }

      return sb.toString();
   }
}
