package sac.pessoa.juridica;

/**
 * Projeto: SAC
 *
 * Tipo: PessoaJuridica
 *
 */

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.ArrayList;

import sac.exception.InvalidArgumentException;
import sac.exception.NullArgumentException;
import sac.pessoa.SenhaInvalidaException;
import sac.pessoa.UsuarioComum;
import sac.pessoa.util.HandlerCNPJ;
import sac.pessoa.util.HandlerString;
import sac.pessoa.endereco.Endereco;


public class PessoaJuridica extends UsuarioComum
{
   private List enderecos;
   private List ofertasTrabalho;
   private String cnpj;
   /* Mapeamento de categoria em suas subcategorias. String -> Set [String] */
   private Map categorias;
   private String servicosOferecidos;
   private String inscricaoMunicipal;
   private String inscricaoEstadual;
   private String homePage;
   private HandlerString verificadorCNPJ = new HandlerCNPJ();

  /**
   * Construtor da Classe PessoaJuridica
   *
   * @param nome   Nome da Pessoa Juridica
   * @param cnpj   CNPJ da Pessoa Juridica
   * @param senha  Senha da Pessoa Juridica
   *
   */
  public PessoaJuridica(String nome, String cnpj, String senha, Map categorias, String inscricaoMunicipal, List enderecos)
      throws CNPJInvalidoException, SenhaInvalidaException, NullArgumentException, InvalidArgumentException {
          super(nome, cnpj, senha, UsuarioComum.STATUS_PESSOA_JURIDICA);

          setCnpj(cnpj);
          setCategorias(categorias);
          setInscricaoMunicipal(inscricaoMunicipal);
          setEnderecos(enderecos);
          setOferta(new ArrayList());
          setInscricaoEstadual("");
          setHomePage("");
  }
  /**
   * Metodo que recupera categoria da pessoa juridica
   *
   * @return Map da String da  categoria da pessoa juridica num List de String de sub_categorias
   *
   */
    public Map getCategorias() {
      return categorias;
    }

    /**
     * Metodo que recupera cnpj da pessoa juridica
     *
     * @return String  cnpj da pessoa juridica
     *
     */
    public String getCnpj() {
              return this.cnpj;
    }
  /**
   * Metodo que recupera enderecos da pessoa juridica
   *
   * @return List  lista de enderecos da pessoa juridica
   *
   */
  public List getEnderecos() {
            return this.enderecos;
  }
  /**
   * Metodo que recupera a HomePage da pessoa juridica
   *
   * @return String  HomePage da pessoa juridica
   *
   */
  public String getHomePage() {
            return this.homePage;
  }
  /**
   * Metodo que recupera Inscricao Estadual da pessoa juridica
   *
   * @return String  inscricaoEstadual da pessoa juridica
   *
   */
  public String getInscricaoEstadual() {
            return this.inscricaoEstadual;
  }
  /**
   * Metodo que recupera Inscricao Municipal da pessoa juridica
   *
   * @return String  inscricaoMunicipal da pessoa juridica
   *
   */
  public String getInscricaoMunicipal() {
            return this.inscricaoMunicipal;
  }
  /**
   * Metodo que recupera enderecos da pessoa juridica
   *
   * @return List  lista de ofertas da pessoa juridica
   *
   */
  public List getOferta() {
            return this.ofertasTrabalho;
  }
   /**
   * Metodo que recupera os servicos oferecidos da pessoa juridica
   *
   * @return String  servicos oferecidos pela pessoa juridica
   *
   */
  public String getServicosOferecidos() {
            return this.servicosOferecidos;
  }
  /**
   * Metodo que altera a categoria da pessoa juridica
   *
   * @param categorias  novas categorias da pessoa juridica
   *
   */
  public void setCategorias(Map categorias) {
    this.categorias = categorias;
  }

  /**
   * Metodo que altera o cnpj da pessoa juridica
   *
   * @param newCpf  novo cnpj da pessoa juridica
   *
   */
  public void setCnpj(String newCnpj)  throws CNPJInvalidoException, NullArgumentException {
      if ( newCnpj == null){
          throw new NullArgumentException ("valor do cpf nulo.");
      } else  if (verificadorCNPJ.valida(newCnpj)) {
          this.cnpj = newCnpj;
      } else {
          throw new CNPJInvalidoException("Valor do cnpj inválido, cnpj = "+ newCnpj+".");
      }
  }
  /**
   * Metodo que altera os endereços  da pessoa jurídica
   *
   * @param newEnderecos  novo servicos da pessoa jurídica
   *
   */
   public void setEnderecos(List newEnderecos) throws NullArgumentException {
      if ( newEnderecos != null && newEnderecos.size() > 0){
          this.enderecos = newEnderecos;
      } else {
          throw new NullArgumentException ("Lista de endereco vazia");
      }
   }
  /**
   * Metodo que altera a HomePage da pessoa juridica
   *
   * @param newHomePage  nova HomePage de atividades da pessoa juridica
   *
   */
  public void setHomePage(String newHomePage){
      if ( newHomePage == null) {
          this.homePage = "";
      } else {
          this.homePage = newHomePage;
      }
  }
  /**
   * Metodo que altera a inscrição estadual da pessoa juridica
   *
   * @param newInscricaoEstadual  nova Inscrição Estadual da pessoa juridica
   *
   */
  public void setInscricaoEstadual(String newInscricaoEstadual){
      if ( newInscricaoEstadual == null ) {
          this.inscricaoEstadual = "";
      } else {
          this.inscricaoEstadual = newInscricaoEstadual;
      }
  }
  /**
   * Metodo que altera a inscrição municipal da pessoa juridica
   *
   * @param newInscricaoMunicipal  nova Inscrição Municipal da pessoa juridica
   *
   */
  public void setInscricaoMunicipal(String newInscricaoMunicipal) throws NullArgumentException {
      if ( newInscricaoMunicipal != null && !newInscricaoMunicipal.equals("")){
          this.inscricaoMunicipal = newInscricaoMunicipal;
      } else {
          throw new NullArgumentException("Valor da Inscrição Municipal nula.");
      }
  }
  /**
   * Metodo que altera as ofertas  da pessoa jurídica
   *
   * @param newOferta  novas ofertas da pessoa jurídica
   *
   */
   public void setOferta(List newOferta){
      if ( newOferta == null ){
          this.ofertasTrabalho = new ArrayList();
      } else {
          this.ofertasTrabalho = newOferta;
      }
   }
  /**
   * Metodo que altera os serviços oferecidos pela pessoa juridica
   *
   * @param newServicosOferecidos  novos serviços oferecidos pela pessoa juridica
   *
   */
  public void setServicosOferecidos(String newServicosOferecidos) throws NullArgumentException{
      if ( newServicosOferecidos != null && !newServicosOferecidos.equals("")){
          this.servicosOferecidos = newServicosOferecidos;
      } else {
          throw new NullArgumentException("Valor dos Servicos Oferecidos nulo.");
      }
  }

   public String toString(){
      StringBuffer sb = new StringBuffer();
      sb.append("Nome: "+getNome().trim() + "\t");
      sb.append("CNpj: "+ getCnpj().trim() + "\t");
      sb.append("Senha: "+getSenha().trim() + "\t");
      sb.append("HomePage: "+ getHomePage().trim() + "\t");
      sb.append("Insc. Estadual: "+ getInscricaoEstadual().trim() + "\t");
      sb.append("Insc Municipal: "+ getInscricaoMunicipal().trim() + "\t");

      sb.append("Servicos: "+ getServicosOferecidos().trim() + "\t");
      sb.append("\n");
      List enderecos = getEnderecos();
      sb.append("Endereco : ");
      for (int i = 0; i < enderecos.size(); i++) {
        sb.append(enderecos.get(i).toString().trim() +  "\t");
      }
      sb.append("\n");
      List ofertas = getOferta();
      sb.append("Ofertas : ");
      for (int i = 0; i < ofertas.size(); i++) {
        sb.append(ofertas.get(i).toString().trim() +  "\t");
      }

      return sb.toString();
   }

}
