package com.spring.common.jpa;

import java.util.Optional;

import org.springframework.data.domain.AuditorAware;
import org.springframework.lang.NonNull;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

import com.spring.infra.security.domain.UserPrincipal;

/**
 * 현재 사용자의 감사 정보를 제공하는 클래스입니다.
 * 
 * <p>이 클래스는 Spring Data JPA의 AuditorAware 인터페이스를 구현하여,
 * 현재 인증된 사용자의 ID를 반환합니다.</p>
 * 
 * <p>사용자는 SecurityContextHolder를 통해 인증 정보를 가져오며,
 * 인증되지 않은 경우에는 빈 값을 반환합니다.</p>
 * 
 * @author mindol
 * @version 1.0
 */
public class UserAuditorAware implements AuditorAware<String> {

    /**
     * 현재 인증된 사용자의 ID를 반환합니다.
     * 
     * <p>사용자가 인증되지 않았거나 인증 정보가 없는 경우에는 빈 Optional을 반환합니다.</p>
     * 
     * @return 현재 사용자의 ID가 포함된 Optional 객체, 인증되지 않은 경우 빈 Optional
     */
    @Override
    public @NonNull Optional<String> getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null || !authentication.isAuthenticated()) {
            return Optional.empty();
        }
        return Optional.of(((UserPrincipal) authentication.getPrincipal()).getAgentUser().getUserId());
    }

}
