package br.com.ufrj.msi2.netuno.contratacao.servicos;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import br.com.ufrj.msi2.netuno.modelo.entidades.CPF;
import br.com.ufrj.msi2.netuno.modelo.entidades.Carga;
import br.com.ufrj.msi2.netuno.modelo.entidades.CargaLog;
import br.com.ufrj.msi2.netuno.modelo.entidades.Contratante;
import br.com.ufrj.msi2.netuno.modelo.entidades.Contrato;
import br.com.ufrj.msi2.netuno.modelo.entidades.Usuario;
import br.com.ufrj.msi2.netuno.modelo.enums.CargaLogEnum;
import br.com.ufrj.msi2.netuno.modelo.exceptions.ResultadoNaoEncontradoException;
import br.com.ufrj.msi2.netuno.modelo.exceptions.ValidacaoException;
import br.com.ufrj.msi2.netuno.modelo.servicos.CargaLogService;
import br.com.ufrj.msi2.netuno.modelo.servicos.CargaService;
import br.com.ufrj.msi2.netuno.modelo.servicos.ContratanteService;
import br.com.ufrj.msi2.netuno.modelo.servicos.ContratoService;
import br.com.ufrj.msi2.netuno.modelo.servicos.UsuarioService;
@Stateless
public class ContratacaoServiceImpl implements ContratacaoService {
private static final long serialVersionUID = -7087952795393582189L;
@EJB
CargaService cargaService;
@EJB
CargaLogService cargaLogService;
@EJB
ContratanteService contratanteService;
@EJB
ContratoService contratoService;
@EJB
UsuarioService usuarioService;
public Contrato criarContrato() {
return this.contratoService.criarContrato();
}
public void salvarContrato(Contratante contratante, Contrato contrato) throws ValidacaoException {
Contratante contratanteComContratosCarregados = contratanteService.recuperaPorIdComContratos(contratante.getId());
contratanteComContratosCarregados.getContratos().add(contrato);
contrato.setDataCriacao(new Date());
try {
contratanteService.salvarContratante(contratanteComContratosCarregados);
} catch (ValidacaoException e) {
throw e;
}
if(contrato.getEnderecoColeta() == null) {
contratoService.salvarContrato(contrato);
} else {
contratoService.salvarContratoAguardandoColeta(contrato);
}
for(Carga c : contrato.getCargas()) {
cargaService.salvar(c);
CargaLog cargaLog = cargaLogService.criarCargaLog();
cargaLog.setCarga(c);
cargaLog.setData(new Date());
if(contrato.getEnderecoColeta() == null) {
cargaLog.setDescricao(CargaLogEnum.aguardandoClienteEntregar);
} else {
cargaLog.setDescricao(CargaLogEnum.aguardandoColeta);
}
cargaLogService.salvarCargaLog(cargaLog);
}
}
public List<Contrato> recuperaContratosAbertosPorContratante(Contratante contratante) {
return contratoService.recuperaContratosAbertosPorContratante(contratante);
}
public List<Contrato> recuperaContratosFechadosPorContratante(Contratante contratante) {
return contratoService.recuperaContratosFechadosPorContratante(contratante);
}
public void estimarDataEntrega(Contrato contrato, boolean temColeta, boolean temEntrega) {
if(contrato.getPortoOrigem() == null || contrato.getPortoDestino() == null) {
contrato.setDataEstimada(null);
} else {
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
if(temColeta) {
cal.add(Calendar.DATE, 1);
}
if(temEntrega) {
cal.add(Calendar.DATE, 1);
}
cal.add(Calendar.DATE, 6);
contrato.setDataEstimada(cal.getTime());
}
}
public void calcularPreco(Contrato contrato, boolean temColeta, boolean temEntrega) {
BigDecimal preco = new BigDecimal(0.0);
for(Carga c : contrato.getCargas()) {
if(c.isCargaPerecivel()) {
preco = preco.add(new BigDecimal(100.0));
}
if(temColeta) {
preco = preco.add(new BigDecimal(50.0));
}
if(temEntrega) {
preco = preco.add(new BigDecimal(50.0));
}
if(c.getPeso() <= 10.0) {
preco = preco.add(new BigDecimal(50.0));
} else if(c.getPeso() <= 100.0) {
preco = preco.add(new BigDecimal(500.0));
} else if(c.getPeso() <= 500.0) {
preco = preco.add(new BigDecimal(2500.0));
} else if(c.getPeso() <= 1000.0) {
preco = preco.add(new BigDecimal(5000.0));
} else if(c.getPeso() <= 2000.0) {
preco = preco.add(new BigDecimal(10000.0));
} else {
preco = preco.add(new BigDecimal(c.getPeso()));
}
}
contrato.setPreco(preco);
}
public Contratante recuperaContratantePorCPF(CPF cpf) throws ResultadoNaoEncontradoException {
return this.contratanteService.recuperaPorCPF(cpf);
}
public Contrato recuperaContratoComCargas(Contrato contrato) {
return this.contratoService.recuperaContratoComCargas(contrato);
}
public CargaLog recuperaUltimoCargaLogDeCarga(Carga carga) {
return this.cargaLogService.recuperaUltimoCargaLogDeCarga(carga);
}
public Contratante criarContratante() {
return this.contratanteService.criarContratante();
}
public void salvarContratante(Contratante contratante) throws ValidacaoException {
try {
contratanteService.salvarContratante(contratante);
} catch (ValidacaoException e) {
throw e;
}
}
public boolean existeUsuarioComCPF(CPF cpf) {
Usuario usuario = this.usuarioService.recuperarUsuario(cpf);
if(usuario == null) {
return false;
}
return true;
}
public boolean existeUsuarioComLogin(String login) {
Usuario usuario = this.usuarioService.recuperarUsuario(login);
if(usuario == null) {
return false;
}
return true;
}
public CargaService getCargaService() {
return cargaService;
}
public CargaLogService getCargaLogService() {
return cargaLogService;
}
public ContratanteService getContratanteService() {
return contratanteService;
}
public ContratoService getContratoService() {
return contratoService;
}
public UsuarioService getUsuarioService() {
return usuarioService;
}
public void setCargaService(CargaService cargaService) {
this.cargaService = cargaService;
}
public void setCargaLogService(CargaLogService cargaLogService) {
this.cargaLogService = cargaLogService;
}
public void setContratanteService(ContratanteService contratanteService) {
this.contratanteService = contratanteService;
}
public void setContratoService(ContratoService contratoService) {
this.contratoService = contratoService;
}
public void setUsuarioService(UsuarioService usuarioService) {
this.usuarioService = usuarioService;
}
}