package br.com.ec.domain.service.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import br.com.ec.core.exception.NegocioException;
import br.com.ec.core.generic.AbstractService;
import br.com.ec.core.generic.GenericRepository;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.core.validador.Validador;
import br.com.ec.domain.dto.LojaDTO;
import br.com.ec.domain.dto.UsuarioDTO;
import br.com.ec.domain.dto.UsuarioLojaDTO;
import br.com.ec.domain.model.Usuario;
import br.com.ec.domain.service.LojaService;
import br.com.ec.domain.service.PerfilService;
import br.com.ec.domain.service.UsuarioLojaService;
import br.com.ec.domain.service.UsuarioService;
import br.com.ec.repository.UsuarioRepository;
import br.com.ec.shared.CriptografiaMD5;
import br.com.ec.shared.EmailComponente;
import br.com.ec.shared.SharedComponente;
@Service
public class UsuarioServiceImpl
extends AbstractService
<Usuario
> implements UsuarioService
{
private static final String USUARIO_INFORMADO_NAO_EXISTE =
"Usuário informado não existe";
private PerfilService perfilService
;
private UsuarioLojaService usuarioLojaService
;
private LojaService lojaService
;
private UsuarioRepository usuarioRepository
;
// private ParametroService parametroService;
@Autowired
public UsuarioServiceImpl
(PerfilService perfilService, UsuarioLojaService usuarioLojaService,
LojaService lojaService, UsuarioRepository usuarioRepository, Validador validador
) {
super(validador
);
this.
perfilService = perfilService
;
this.
usuarioLojaService = usuarioLojaService
;
this.
lojaService = lojaService
;
this.
usuarioRepository = usuarioRepository
;
}
@
Override
protected GenericRepository
<Usuario
> getRepository
() {
return this.
usuarioRepository;
}
@
Override
public UsuarioDTO consultarPorLogin
(String login,
String senha
) {
senha = CriptografiaMD5.
criptografaSenha(senha
);
UsuarioDTO usuarioDTO = usuarioRepository.
consultarPorLogin(login, senha
);
usuarioDTO.
setPerfis(usuarioRepository.
consultarPerfisDoUsuario(usuarioDTO.
getSequencial()));
if (perfilService.
temPerfilAdministrador(usuarioDTO.
getPerfis())) {
List<UsuarioLojaDTO
> listaUsuarioLojaDTO =
new ArrayList<UsuarioLojaDTO
>();
List<LojaDTO
> lojasAtivas = lojaService.
consultarLojasAtivas();
for (LojaDTO lojaAtiva : lojasAtivas
) {
UsuarioLojaDTO usuarioLojaDTO =
new UsuarioLojaDTO
();
usuarioLojaDTO.
setSequencialLoja(lojaAtiva.
getSequencial());
usuarioLojaDTO.
setDescricaoLoja(lojaAtiva.
getDescricao());
listaUsuarioLojaDTO.
add(usuarioLojaDTO
);
}
usuarioDTO.
setLojas(listaUsuarioLojaDTO
);
} else {
usuarioDTO.
setLojas(usuarioLojaService.
consultarLojasDoUsuario(usuarioDTO.
getSequencial()));
}
return usuarioDTO
;
}
@
Override
public UsuarioDTO consultarPorPessoa
(Long sequencialPessoa
) {
return usuarioRepository.
consultarPorPessoa(sequencialPessoa
);
}
@
Override
public void alterarSenhaUsuario
(String login,
String senhaAtual,
String novaSenha
) {
verificarSenhas
(login, senhaAtual, novaSenha
);
usuarioRepository.
alterarSenha(login, CriptografiaMD5.
criptografaSenha(novaSenha
));
}
private void verificarSenhas
(String login,
String senhaAtual,
String novaSenha
) {
if (VerificadorUtil.
estaNuloOuVazio(novaSenha
)) {
throw new NegocioException
("Senha inválida");
}
if (novaSenha.
length() < 6) {
throw new NegocioException
("A senha deve ter 6 dígitos, no mínimo");
}
try {
consultarPorLogin
(login, senhaAtual
);
} catch (Exception e
) {
throw new NegocioException
("Senha atual incorreta");
}
verificarSeSenhaJaExisteEmOutroLogin
(login, novaSenha
);
}
private void verificarSeSenhaJaExisteEmOutroLogin
(String login,
String senha
) {
if (usuarioRepository.
obterQuantidadeUsuarioDiferenteComSenhaInformada(login, CriptografiaMD5.
criptografaSenha(senha
)) > 0) {
throw new NegocioException
("Senha já existente, tente outra");
}
}
@
Override
public String resetarSenhaUsuarioRetornandoEmail
(String login,
String cpf
) {
String emailUsuario = usuarioRepository.
consultarEmailPorLogin(login
);
if (VerificadorUtil.
estaNuloOuVazio(emailUsuario
)) {
throw new NegocioException
("Usuário não possui email, favor entrar em contato com a administração");
}
if (usuarioRepository.
obterQuantidadeUsuarioComLoginCpfInformados(login, cpf
) < 1) {
throw new NegocioException
("Dados não conferem, favor entrar em contato com a administração");
}
String senhaProvisoria =
new SharedComponente
().
gerarSenha(8);
usuarioRepository.
alterarSenha(login, CriptografiaMD5.
criptografaSenha(senhaProvisoria
));
new EmailComponente
()
.
comEmailDestino(emailUsuario
)
.
comAssunto("ESPAÇO CASE - REDEFINIÇÃO DE SENHA")
.
comConteudoHtml("Sua nova senha: " + senhaProvisoria
)
.
enviar();
return emailUsuario
;
}
@
Override
public UsuarioDTO efetuarLogin
(Usuario usuario
) {
if (VerificadorUtil.
naoEstaNuloOuVazio(usuario.
getSenha())) {
if (usuario.
getSenha().
length() < 6) {
throw new RuntimeException("Senha inválida");
}
} else {
throw new RuntimeException("Senha inválida");
}
try {
criptografarSenhaUsuarioEmMD5
(usuario
);
UsuarioDTO usuarioConsultado = usuarioRepository.
consultarPorLogin(usuario.
getLogin(), usuario.
getSenha());
if (VerificadorUtil.
naoEstaNulo(usuarioConsultado
)) {
// usuarioRepository.atualizarDataUltimoAcesso(usuarioConsultado);
}
// usuarioConsultado.setParametros(parametroService.listarParametrosAtivos());
return usuarioConsultado
;
} catch (Exception e
) {
throw new RuntimeException(USUARIO_INFORMADO_NAO_EXISTE
);
}
}
private void criptografarSenhaUsuarioEmMD5
(Usuario usuario
) {
usuario.
setSenha(CriptografiaMD5.
criptografaSenha(usuario.
getSenha()));
}
@
Override
public void alterar
(UsuarioDTO usuarioDTO
) {
Usuario usuario = consultarPorId
(new Usuario
(usuarioDTO.
getSequencial()));
usuario.
atualizarDados(usuarioDTO
);
alterar
(usuario
);
}
/*
@Override
protected void regrasNegocioCadastrar(Usuario usuario) {
usuario.setSenha(CriptografiaMD5.criptografaSenha(usuario.getSenha()));
usuario.setAtivo(true);
}
@Override
public Usuario consultarUsuarioPorSenha(String senha) {
try {
senha = CriptografiaMD5.criptografaSenha(senha);
return usuarioRepository.consultarUsuarioPorSenha(senha);
} catch (Exception e) {
throw new RuntimeException(USUARIO_INFORMADO_NAO_EXISTE);
}
}
@Override
public Usuario consultarUsuarioPorPessoa(Pessoa pessoa) {
return usuarioRepository.consultarUsuarioPorPessoa(pessoa);
}
@Override
public Usuario detalhar(Usuario usuario) {
return usuarioRepository.detalhar(usuario);
}
*/
}