package sac.bibliografia;

import javax.servlet.http.HttpServletRequest;

import java.text.SimpleDateFormat;
import java.text.ParseException;

import sac.exception.NullArgumentException;

public class ReferenciaBibliograficaBean {

  private String origem;
  private String localArmazenamento;
  private String titulo;
  private String trecho;
  private String dataPublicacao;
  private String mensagemErro;
  private int tipo;
  private sac.persistencia.OID referenciaBibliograficaOID;
  private String autores;

  /** Constantes que definem os nomes dos Inputs do Form. */
  private static final String ORIGEM_INPUT = "origem";
  private static final String TITULO_INPUT = "titulo";
  private static final String LOCAL_ARMAZENAMENTO_INPUT = "localArmazenamento";
  private static final String TRECHO_INPUT = "trecho";
  private static final String OID_INPUT = "oid";
  private static final String DATA_PUBLICACAO_INPUT = "dataPublicacao";
  private static final String LISTA_AUTORES_INPUT = "listaAutores";
  private static final String SELECT_ARTIGO_LIVRO_INPUT = "select_livro_artigo";

  public ReferenciaBibliograficaBean() {
  }

  public ReferenciaBibliograficaBean(ReferenciaBibliografica ref) {
    setOrigem(ref.getOrigem());
    setLocalArmazenamento(ref.getLocalArmazenamento());
    String titulo = ref.getTitulo();
    System.out.println("t="+titulo);
    setTitulo(titulo);
    setTrecho(ref.getTrecho());

    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/mm/yyyy");
    java.util.Date d = ref.getDataPublicacao();
    System.out.println("d="+d);
    String dataSt = dateFormat.format(d);

    setDataPublicacao(dataSt);
    setAutores(ref.getAutores());
    setTipo(ref.getTipo());
    setReferenciaBibliograficaOID(ref.getID());
    setMensagemErro("");
  }

  public ReferenciaBibliograficaBean(HttpServletRequest request) {
    setOrigem(request.getParameter(ORIGEM_INPUT));
    setLocalArmazenamento(request.getParameter(LOCAL_ARMAZENAMENTO_INPUT));
    setTitulo(request.getParameter(TITULO_INPUT));
    setTrecho(request.getParameter(TRECHO_INPUT));
    setDataPublicacao(request.getParameter(DATA_PUBLICACAO_INPUT));
    setAutores(request.getParameter(LISTA_AUTORES_INPUT));
    setTipo(Integer.parseInt(request.getParameter(SELECT_ARTIGO_LIVRO_INPUT)));
    setReferenciaBibliograficaOID(null);
  }

  public void validaBean() throws CampoInvalidoException {
    StringBuffer mensagemErro = new StringBuffer("O(s) campo(s) ");
    boolean erro = false;

    if(origem.equals("")) {
        mensagemErro.append("ORIGEM ");
        erro = true;
    }
    if (titulo.equals("")) {
        mensagemErro.append("TITULO ");
        erro = true;
    }
    if(localArmazenamento.equals("")) {
        mensagemErro.append("LOCAL ARMAZENAMENTO ");
        erro = true;
    }
    if(dataPublicacao.equals("")){
        mensagemErro.append("DATA PUBLICACAO ");
        erro = true;
    }
    if(autores.equals("")) {
        mensagemErro.append("AUTORES ");
        erro = true;
    }
    mensagemErro.append("devem(m) ser preenchido(s)");

    String msgErroFinal = "";

    if (erro) {
      msgErroFinal = mensagemErro.toString();
    }

    if (dataPublicacao!=null) {
      try {
        SimpleDateFormat date = new SimpleDateFormat("dd/mm/yyyy");
        date.parse(dataPublicacao);
      } catch (ParseException exc) {
        erro = true;
        msgErroFinal = msgErroFinal + " O formato da data está incorreto.";
      }
    }

    if (erro) {
      setMensagemErro(msgErroFinal);
      throw new CampoInvalidoException(msgErroFinal);
    }
  }

  public ReferenciaBibliografica getReferenciaBibliografica() throws NullArgumentException {
    ReferenciaBibliografica response = new ReferenciaBibliografica();
    response.setOrigem(origem);
    response.setLocalArmazenamento(localArmazenamento);
    response.setTitulo(titulo);
    response.setTrecho(trecho);
    response.setID(referenciaBibliograficaOID);
    try {
      SimpleDateFormat date = new SimpleDateFormat("dd/mm/yyyy");
      response.setDataPublicacao(date.parse(dataPublicacao));
    } catch (ParseException exc) {
      System.out.println("O bean jah deve ter sido validado antes de chamar o metodo para obter uma referencia bibliografica.");
      exc.printStackTrace();
    }
    response.setAutores(autores);
    response.setTipo(tipo);
    response.setID(referenciaBibliograficaOID);

    return response;
  }

  public void inicializaBeanVazio() {
    setAutores("");
    setDataPublicacao("");
    setTrecho("");
    setLocalArmazenamento("");
    setOrigem("");
    setTitulo("");
    setMensagemErro("");
    setTipo(1);
  }

  public String getOrigem() {
    return origem;
  }

  public void setOrigem(String origem) {
    this.origem = origem;
  }

  public void setLocalArmazenamento(String localArmazenamento) {
    this.localArmazenamento = localArmazenamento;
  }

  public String getLocalArmazenamento() {
    return localArmazenamento;
  }

  public void setTitulo(String titulo) {
    this.titulo = titulo;
  }

  public String getTitulo() {
    return titulo;
  }

  public void setTrecho(String trecho) {
    this.trecho = trecho;
  }

  public String getTrecho() {
    return trecho;
  }



  public void setDataPublicacao(String dataPublicacao) {
    this.dataPublicacao = dataPublicacao;
  }

  public String getDataPublicacao() {
    return dataPublicacao;
  }



  public void setMensagemErro(String mensagemErro) {
    this.mensagemErro = mensagemErro;
  }

  public String getMensagemErro() {
    return mensagemErro;
  }

  public void setTipo(int tipo) {
    this.tipo = tipo;
  }

  public int getTipo() {
    return tipo;
  }

  public void setReferenciaBibliograficaOID(sac.persistencia.OID referenciaBibliograficaOID) {
    this.referenciaBibliograficaOID = referenciaBibliograficaOID;
  }

  public sac.persistencia.OID getReferenciaBibliograficaOID() {
    return referenciaBibliograficaOID;
  }
  public void setAutores(String autores) {
    this.autores = autores;
  }
  public String getAutores() {
    return autores;
  }
}