package br.gov.al.saude.scs.tipo;
import java.util.Date;
import java.util.Set;
import br.gov.al.saude.framework.core.util.DataUtils;
import br.gov.al.saude.framework.core.util.VerificadorUtil;
import br.gov.al.saude.scs.model.Turma;
import br.gov.al.saude.scs.model.TurmaPeriodo;
import br.gov.al.saude.scs.model.dto.TurmaDTO;
public enum TipoSituacaoTurma
{
NAO_INICIADA
("N",
"Não Iniciada"),
EM_ANDAMENTO
("E",
"Em Andamento"),
CONCLUIDA
("C",
"Concluída");
private String tipo
;
private String descricao
;
private TipoSituacaoTurma
(String tipo,
String descricao
) {
this.
tipo = tipo
;
this.
descricao = descricao
;
}
public String getValor
() {
return tipo
;
}
public String getDescricao
() {
return descricao
;
}
public static TipoSituacaoTurma parse
(String tipo
) {
for (TipoSituacaoTurma item : TipoSituacaoTurma.
values()) {
if (item.
getValor().
equals(tipo
)) {
return item
;
}
}
return null;
}
public static TipoSituacaoTurma parse
(TurmaDTO turmaDTO
) {
if(VerificadorUtil.
naoEstaNulo(turmaDTO
)){
if(isDataAtualPosteriorAhDataInformada
(turmaDTO.
getDataFinal())){
return TipoSituacaoTurma.
CONCLUIDA;
}
else if((isDataAtualPosteriorAhDataInformada
(turmaDTO.
getDataInicial()) ||
isDataAtualIgualAhDataInformada
(turmaDTO.
getDataInicial())) &&
(isDataAtualIgualAhDataInformada
(turmaDTO.
getDataFinal()) ||
isDataAtualAnteriorAhDataInformada
(turmaDTO.
getDataFinal()))){
return TipoSituacaoTurma.
EM_ANDAMENTO;
}
else if(isDataAtualAnteriorAhDataInformada
(turmaDTO.
getDataInicial())){
return TipoSituacaoTurma.
NAO_INICIADA;
}
}
return null;
}
private static boolean isDataAtualAnteriorAhDataInformada
(Date data
) {
return DataUtils.
getDataAtual().
before(data
);
}
private static boolean isDataAtualPosteriorAhDataInformada
(Date data
) {
return DataUtils.
getDataAtual().
after(data
);
}
private static boolean isDataAtualIgualAhDataInformada
(Date data
) {
return DataUtils.
getDataAtual().
equals(data
);
}
public static String recuperarTipoSituacao
(Turma turma,
Date dataAtual
){
Set<TurmaPeriodo
> periodos = turma.
getPeriodos();
Date menorDataInicial =
null;
Date maiorDataFinal =
null;
for (TurmaPeriodo turmaPeriodo : periodos
) {
Date dataInicial = turmaPeriodo.
getDataInicial();
Date dataFinal = turmaPeriodo.
getDataFinal();
if(VerificadorUtil.
estaNulo(menorDataInicial
) && VerificadorUtil.
estaNulo(maiorDataFinal
)){
menorDataInicial = dataInicial
;
maiorDataFinal = dataFinal
;
}
if (dataInicial.
before(menorDataInicial
)) {
menorDataInicial = dataInicial
;
}
if (dataFinal.
after(maiorDataFinal
)) {
maiorDataFinal = dataFinal
;
}
}
if (dataAtual.
before(menorDataInicial
)) {
return TipoSituacaoTurma.
NAO_INICIADA.
getDescricao();
}
if ((dataAtual.
equals(menorDataInicial
) || dataAtual.
after(menorDataInicial
)) && (dataAtual.
before(maiorDataFinal
) || dataAtual.
equals(maiorDataFinal
))){
return TipoSituacaoTurma.
EM_ANDAMENTO.
getDescricao();
}
if (dataAtual.
equals(maiorDataFinal
) || dataAtual.
after(maiorDataFinal
)) {
return TipoSituacaoTurma.
CONCLUIDA.
getDescricao();
}
return TipoSituacaoTurma.
CONCLUIDA.
getDescricao();
}
// Situação da Turma
// Valores possíveis: Não Iniciada, Em Andamento e Concluída.
//
// Não Iniciada: Data atual for inferior a data e hora inicial dos períodos.
// Em Andamento: Data atual estiver entre a data e hora de início e fim dos períodos.
// Concluída: Data atual for superior a data e hora final dos períodos.
}