package br.com.dextra.dextranet.conteudo.post;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import br.com.dextra.dextranet.conteudo.Conteudo;
import br.com.dextra.dextranet.conteudo.ConteudoIndexavel;
import br.com.dextra.dextranet.conteudo.post.comentario.Comentario;
import br.com.dextra.dextranet.utils.ConteudoHTML;
import br.com.dextra.dextranet.utils.TimeMachine;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Text;
import com.google.appengine.api.search.Document;
import com.google.appengine.api.search.Field;
public class Post extends Conteudo implements ConteudoIndexavel {
private String titulo;
private Date dataDeAtualizacao;
private List<Comentario> comentarios;
public Post(String usuario, String titulo, String conteudo) {
super(usuario);
this.preenche(titulo, conteudo);
this.dataDeAtualizacao = this.dataDeCriacao;
comentarios = new ArrayList<Comentario>();
}
@SuppressWarnings("unchecked")
public Post(Entity postEntity) {
super((String) postEntity.getProperty(PostFields.usuario.name()));
this.comentarios = new ArrayList<Comentario>();
this.id = (String) postEntity.getProperty(PostFields.id.name());
this.titulo = (String) postEntity.getProperty(PostFields.titulo.name());
this.conteudo = ((Text) postEntity.getProperty(PostFields.conteudo.name())).getValue();
this.quantidadeDeCurtidas = (Long) postEntity.getProperty(PostFields.quantidadeDeCurtidas.name());
this.usuariosQueCurtiram = (List<String>) postEntity.getProperty(PostFields.usuariosQueCurtiram.name());
this.dataDeCriacao = (Date) postEntity.getProperty(PostFields.dataDeCriacao.name());
this.dataDeAtualizacao = (Date) postEntity.getProperty(PostFields.dataDeAtualizacao.name());
if (this.usuariosQueCurtiram == null) {
this.usuariosQueCurtiram = new ArrayList<String>();
}
}
public Post preenche(String titulo, String conteudo) {
ConteudoHTML conteudoHTML = new ConteudoHTML(conteudo);
this.conteudo = conteudoHTML.removeJavaScript();
conteudoHTML.setConteudo(titulo);
this.titulo = conteudoHTML.removeJavaScript();
this.dataDeAtualizacao = new TimeMachine().dataAtual();
return this;
}
public String getTitulo() {
return titulo;
}
public long getQuantidadeDeComentarios() {
return comentarios.size();
}
public Date getDataDeAtualizacao() {
return dataDeAtualizacao;
}
@Deprecated
public Comentario comentarParaMigracao(String username, String conteudo, Date data, String timestamp) {
Comentario comentario = new Comentario(this.id, username, new ConteudoHTML(conteudo).removeJavaScript());
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(Long.parseLong(timestamp));
data = calendar.getTime();
comentario.registraDataDeMigracao(data);
this.dataDeAtualizacao = data;
comentarios.add(comentario);
return comentario;
}
public Comentario comentar(String username, String conteudo) {
Comentario comentario = new Comentario(this.id, username, new ConteudoHTML(conteudo).removeJavaScript());
comentarios.add(comentario);
this.dataDeAtualizacao = new Date();
return comentario;
}
public void adicionarComentarios(List<Comentario> comentarios) {
this.comentarios.clear();
this.comentarios.addAll(comentarios);
}
public List<Comentario> getComentarios() {
return comentarios;
}
@Override
public Entity toEntity() {
Entity entidade = new Entity(this.getKey(this.getClass()));
entidade.setProperty(PostFields.id.name(), this.id);
entidade.setProperty(PostFields.titulo.name(), this.titulo);
entidade.setProperty(PostFields.conteudo.name(), new Text(this.conteudo));
entidade.setProperty(PostFields.quantidadeDeCurtidas.name(), this.quantidadeDeCurtidas);
entidade.setProperty(PostFields.usuariosQueCurtiram.name(), this.usuariosQueCurtiram);
entidade.setProperty(PostFields.usuario.name(), this.usuario);
entidade.setProperty(PostFields.usuarioMD5.name(), this.usuarioMD5);
entidade.setProperty(PostFields.dataDeCriacao.name(), this.dataDeCriacao);
entidade.setProperty(PostFields.dataDeAtualizacao.name(), this.dataDeAtualizacao);
return entidade;
}
@Override
public String toString() {
return "Post [titulo=" + titulo + ", dataDeAtualizacao=" + dataDeAtualizacao + ", usuario=" + usuario + ", dataDeCriacao=" + dataDeCriacao + ", quantidadeDeCurtidas="
+ quantidadeDeCurtidas + ", id=" + id + "]";
}
@Override
public Document toDocument() {
Document document = Document.newBuilder().setId(id)
.addField(Field.newBuilder().setName(PostFields.id.name()).setText(id))
.addField(Field.newBuilder().setName(PostFields.dataDeCriacao.name()).setDate(dataDeCriacao))
.addField(Field.newBuilder().setName(PostFields.titulo.name()).setText(titulo))
.addField(Field.newBuilder().setName(PostFields.conteudo.name()).setText(conteudo))
.addField(Field.newBuilder().setName(PostFields.usuario.name()).setText(usuario)).build();
return document;
}
@Override
public void registraDataDeMigracao(Date data) {
TimeMachine tMachine = new TimeMachine();
Date dataFormatada = tMachine.transformaEmData(tMachine.formataData(data));
super.registraDataDeMigracao(dataFormatada);
this.dataDeAtualizacao = dataFormatada;
}
}