-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEvento.java
More file actions
152 lines (132 loc) · 5.05 KB
/
Copy pathEvento.java
File metadata and controls
152 lines (132 loc) · 5.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public final class Evento {
private static final DateTimeFormatter EXIBICAO_FORMATTER =
DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
private static final long DURACAO_PADRAO_HORAS = 2;
private final int id;
private final String nome;
private final String endereco;
private final Categoria categoria;
private final LocalDateTime horario;
private final String descricao;
private final Set<String> participantes;
public Evento(int id,
String nome,
String endereco,
Categoria categoria,
LocalDateTime horario,
String descricao) {
this.id = id;
this.nome = nome;
this.endereco = endereco;
this.categoria = categoria;
this.horario = horario;
this.descricao = descricao;
this.participantes = new HashSet<>();
}
public int getId() { return id; }
public String getNome() { return nome; }
public String getEndereco() { return endereco; }
public Categoria getCategoria() { return categoria; }
public LocalDateTime getHorario() { return horario; }
public String getDescricao() { return descricao; }
public int getQuantidadeParticipantes() { return participantes.size(); }
public boolean estaOcorrendoAgora() {
LocalDateTime agora = LocalDateTime.now();
LocalDateTime fim = horario.plusHours(DURACAO_PADRAO_HORAS);
return (agora.isEqual(horario) || agora.isAfter(horario)) && agora.isBefore(fim);
}
public boolean jaOcorreu() {
return LocalDateTime.now().isAfter(horario.plusHours(DURACAO_PADRAO_HORAS));
}
public boolean participa(String email) {
return participantes.contains(email.toLowerCase());
}
public void adicionarParticipante(String email) {
participantes.add(email.toLowerCase());
}
public void removerParticipante(String email) {
participantes.remove(email.toLowerCase());
}
private static String escapar(String texto) {
return texto.replace("\\", "\\\\").replace("|", "\\|");
}
private static List<String> dividirEscapado(String linha) {
List<String> partes = new ArrayList<>();
StringBuilder atual = new StringBuilder();
boolean escape = false;
for (char c : linha.toCharArray()) {
if (escape) {
atual.append(c);
escape = false;
} else if (c == '\\') {
escape = true;
} else if (c == '|') {
partes.add(atual.toString());
atual.setLength(0);
} else {
atual.append(c);
}
}
partes.add(atual.toString());
return partes;
}
public String serializar() {
String participantesTexto = String.join(",", participantes);
return id + "|" +
escapar(nome) + "|" +
escapar(endereco) + "|" +
categoria.name() + "|" +
horario.toString() + "|" +
escapar(descricao) + "|" +
escapar(participantesTexto);
}
public static Evento desserializar(String linha) {
List<String> partes = dividirEscapado(linha);
if (partes.size() < 7) {
return null;
}
int id = Integer.parseInt(partes.get(0));
String nome = partes.get(1);
String endereco = partes.get(2);
Categoria categoria = Categoria.valueOf(partes.get(3));
LocalDateTime horario = LocalDateTime.parse(partes.get(4));
String descricao = partes.get(5);
String participantesTexto = partes.get(6);
Evento evento = new Evento(id, nome, endereco, categoria, horario, descricao);
if (!participantesTexto.isBlank()) {
String[] itens = participantesTexto.split(",");
for (String item : itens) {
String email = item.trim();
if (!email.isBlank()) {
evento.adicionarParticipante(email);
}
}
}
return evento;
}
@Override
public String toString() {
String status;
if (estaOcorrendoAgora()) {
status = "OCORRENDO AGORA";
} else if (jaOcorreu()) {
status = "JÁ OCORREU";
} else {
status = "PRÓXIMO";
}
return "ID: " + id +
"\nNome: " + nome +
"\nEndereço: " + endereco +
"\nCategoria: " + categoria +
"\nHorário: " + horario.format(EXIBICAO_FORMATTER) +
"\nDescrição: " + descricao +
"\nParticipantes confirmados: " + getQuantidadeParticipantes() +
"\nStatus: " + status;
}
}