package org.egl_cepgl.pm.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.egl_cepgl.pm.dto.UserDto;
import org.egl_cepgl.pm.exception.EntityNotFoundException;
import org.egl_cepgl.pm.exception.ErrorCodes;
import org.egl_cepgl.pm.exception.InvalidEntityException;
import org.egl_cepgl.pm.model.user.User;
import org.egl_cepgl.pm.repository.UserRepository;
//import org.egl_cepgl.pm.validator.SignInValidator;
import org.egl_cepgl.pm.validator.UserValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

@Slf4j
@Service
public class UserService {

    private UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public UserDto addUser(UserDto userDto)
    {
        UserValidator userValidator= new UserValidator(userRepository);
        Map<String, List<String>> errors= userValidator.validate(userDto);
        if(!errors.isEmpty()) {
            throw new InvalidEntityException("Invalid", ErrorCodes.USER_NOT_VALID, errors);
        }
        log.info("BVDDDDDDDDDDDDEEEE==="+userDto.toString());
        return UserDto.fromEntity(this.userRepository.save(UserDto.toEntity(userDto)));
    }

    public List<User> findAllUsers()
    {
        return userRepository.findAll();
    }

    public UserDto findByEmail(String user, Boolean create_if_not_exists) throws JsonProcessingException
    {
        User userc = new ObjectMapper().readValue(user, User.class);

        log.info("Hellllllloooo"+user+ "-----" + userc.getFirst_name());
        return UserDto.fromEntity(userc);
//        User userf= userRepository.findUserByEmail(user.getEmail()).map(UserDto::fromEntity).orElseThrow(() -> {
//                if(create_if_not_exists) {
//                    this.addUser(UserDto.fromEntity(user));
//                }
//                new EntityNotFoundException("L'Utilisateur avec l'email: "+ user.getEmail() +"n'a pas été trouvé dans la BDD", ErrorCodes.USER_NOT_FOUND);
//            return null;
//        });
    }
}
