package br.gov.mj.sislegis.app.model.pautacomissao;
import java.io.Serializable;
import java.util.Date;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;
import br.gov.mj.sislegis.app.enumerated.Origem;
import br.gov.mj.sislegis.app.enumerated.SituacaoCamara;
import br.gov.mj.sislegis.app.enumerated.SituacaoSenado;
import br.gov.mj.sislegis.app.model.AbstractEntity;
import br.gov.mj.sislegis.app.model.Comissao;
import br.gov.mj.sislegis.app.util.SislegisUtil;
@Entity
@Table(name = "PautaReuniaoComissao", uniqueConstraints = @UniqueConstraint(columnNames = { "comissao", "data",
"codigoReuniao" }))
@NamedQueries({
@NamedQuery(name = "findByCodigoReuniao", query = "select p from PautaReuniaoComissao p where p.codigoReuniao=:codigoReuniao"),
@NamedQuery(name = "findByComissaoDataOrigem", query = "select p from PautaReuniaoComissao p where p.comissao=:comissao and p.data=:data and p.codigoReuniao=:codigoReuniao "),
@NamedQuery(name = "findByIntervaloDatas", query = "select p from PautaReuniaoComissao p where p.data between :dataInicial and :dataFinal"),
@NamedQuery(name = "findPendentes", query = "select p from PautaReuniaoComissao p where p.data < :date and p.situacao in :situacoesEmAberto order by p.data desc ")
})
public class PautaReuniaoComissao extends AbstractEntity implements Serializable, Comparable<PautaReuniaoComissao> {
/**
*
*/
private static final long serialVersionUID = 3945232017168732404L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@Column
String comissao;
@Column
Date data;
@Enumerated(EnumType.STRING)
@Column
private Origem origem;
@Column
protected Integer codigoReuniao;
@Column
String linkPauta;
@Column
protected String titulo;
@Column
@Enumerated(EnumType.STRING)
protected SituacaoSessao situacao = SituacaoSessao.Desconhecido;
@Column
protected String tipo;
@Transient
private boolean manual = false;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "pautaReuniaoComissao")
@OrderBy("ordemPauta")
SortedSet<ProposicaoPautaComissao> proposicoesDaPauta = new TreeSet<ProposicaoPautaComissao>();
PautaReuniaoComissao() {
}
public PautaReuniaoComissao(Date data, Comissao comissao, Integer codigoReuniao) {
this.data = data;
this.comissao = comissao.getSigla();
this.codigoReuniao = codigoReuniao;
}
public PautaReuniaoComissao(Date data, String siglaComissao, Integer codigoReuniao) {
this.data = data;
this.comissao = siglaComissao;
this.codigoReuniao = codigoReuniao;
}
public Origem getOrigem() {
return origem;
}
public void setOrigem(Origem origem) {
this.origem = origem;
}
public String getComissao() {
return comissao;
}
public Date getData() {
return data;
}
public void setData(Date date) {
this.data = date;
}
public String getLinkPauta() {
return linkPauta;
}
public void setLinkPauta(String linkPauta) {
this.linkPauta = linkPauta;
}
public Integer getCodigoReuniao() {
return codigoReuniao;
}
public void setCodigoReuniao(Integer codigoReuniao) {
this.codigoReuniao = codigoReuniao;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public SituacaoSessao getSituacao() {
return situacao;
}
public void setSituacao(SituacaoSessao situacao) {
this.situacao = situacao;
}
public String getTipo() {
return tipo;
}
public void setTipo(String tipo) {
this.tipo = tipo;
}
public SortedSet<ProposicaoPautaComissao> getProposicoesDaPauta() {
return proposicoesDaPauta;
}
public void setProposicoesDaPauta(SortedSet<ProposicaoPautaComissao> proposicoes) {
this.proposicoesDaPauta = proposicoes;
}
public void addProposicaoPauta(ProposicaoPautaComissao ppc) {
proposicoesDaPauta.add(ppc);
}
public boolean isManual() {
return manual;
}
public void setManual(boolean manual) {
this.manual = manual;
}
public Long getId() {
return id;
}
// Converte situacao do tipo String, da Camara ou do Senado
public void converterSituacao(String situacao) {
situacao = situacao.replaceAll("\\s", "");
switch (origem) {
case CAMARA:
try {
situacao = situacao.replaceAll("\\(\\w+\\)", "").trim();
setSituacao(SituacaoCamara.valueOf(situacao).situacaoSessaoCorrespondente());
} catch (IllegalArgumentException e) {
Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).log(Level.SEVERE, "Falha ao converter a situacao da Camara: " + situacao, e);
setSituacao(SituacaoSessao.Desconhecido);
}
break;
case SENADO:
try {
setSituacao(SituacaoSenado.valueOf(situacao).situacaoSessaoCorrespondente());
} catch (IllegalArgumentException e) {
Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).log(Level.SEVERE, "Falha ao converter a situacao da Senado: " + situacao, e);
setSituacao(SituacaoSessao.Desconhecido);
}
break;
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(comissao);
sb.append(" Código:{").append(codigoReuniao).append("}").append(getSituacao()).append(" contém ").append(proposicoesDaPauta.size())
.append(" proposicoes na pauta");
return sb.toString();
}
@Override
public int compareTo(PautaReuniaoComissao o) {
if (o == null) {
System.err.println("O nulo");
return 1;
}
if (o.data == null) {
System.err.println("O.data nulo");
return 1;
}
if (data == null) {
System.err.println("data nulo");
return 1;
}
if (o.data.after(data)) {
return -1;
} else if (o.data.before(data)) {
return 1;
}
return 0;
}
}