package com.zioinfo.mall.uiws.common;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

/**
 * 현재 인증 사용자 식별자(=ERP username) 추출 헬퍼. 감사 컬럼(created_by/updated_by) 및
 * 소유자(writer_id/owner_id/sender_id) 기록에 사용한다.
 *
 * ERP JwtFilter 는 인증 principal 로 username(String)을 세팅하므로 그 값을 그대로 사용한다.
 * (UIWS 원본의 CurrentUser/UserPrincipal 패턴을 ERP 인증 모델에 맞게 단순화 이식.)
 */
public final class UiwsCurrentUser {

    private static final String SYSTEM = "SYSTEM";

    private UiwsCurrentUser() {
    }

    /** 현재 사용자 ID(username). 미인증/시스템 컨텍스트는 "SYSTEM". */
    public static String id() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null && auth.isAuthenticated() && auth.getPrincipal() instanceof String username
                && !"anonymousUser".equals(username)) {
            return username;
        }
        return SYSTEM;
    }

    /** ADMIN 권한 보유 여부(데이터 가시범위 판정용 — ADMIN=전체). */
    public static boolean isAdmin() {
        return hasRole("ADMIN");
    }

    /** MANAGER 이상(MANAGER/ADMIN) 여부 — 업무일지 댓글 권한 등에 사용. */
    public static boolean isManagerOrAbove() {
        return hasRole("ADMIN") || hasRole("MANAGER") || hasRole("CFO");
    }

    private static boolean hasRole(String role) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth == null) {
            return false;
        }
        return auth.getAuthorities().stream()
                .anyMatch(a -> ("ROLE_" + role).equals(a.getAuthority()));
    }
}
