package eu.dnetlib.repo.manager.service;

import org.mitre.openid.connect.model.OIDCAuthenticationToken;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service("userService")
public class UserServiceImpl implements UserService {

    private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger
            .getLogger(UserServiceImpl.class);

    @Value("${oidc.issuer}")
    private String oidc_issuer;

    @Override
    public ResponseEntity<Object> login() {
        OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
        LOGGER.debug("User authentication : " + authentication);
        Map<String,Object> body = new HashMap<>();
        body.put("sub",authentication.getSub());
        if(authentication.getUserInfo().getName() == null || authentication.getUserInfo().getName().equals(""))
            body.put("name",authentication.getUserInfo().getGivenName() + " " + authentication.getUserInfo().getFamilyName());
        else
            body.put("name",authentication.getUserInfo().getName());

        body.put("email",authentication.getUserInfo().getEmail());
        List<String> roles = authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());
        body.put("role",roles);

        return new ResponseEntity<>(body, HttpStatus.OK);
    }
}
