package com.infoclinika.pdx.security;

import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

import java.util.Objects;

/**
 * Utility class to work with authentication issues.
 */
public final class AuthenticationProvider {

    private static final String ANONYMOUS_USER_NAME = "anonymousUser";

    /**
     * Checks if user is logged in.
     *
     * @return `True` if user is logged in, otherwise `false`
     */
    public static boolean userLoggedIn() {
        final Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (Objects.isNull(auth)) {
            return false;
        }
        return !ANONYMOUS_USER_NAME.equalsIgnoreCase(auth.getName());
    }

    /**
     * Retrieves id of logged in user.
     *
     * @return Current user id
     */
    public static long getCurrentUserId() {
        if (!userLoggedIn()) {
            throw new AccessDeniedException("User is unauthorized");
        }

        final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        final CurrentUser user = (CurrentUser) authentication.getPrincipal();

        return user.getId();
    }
}
