package com.zioinfo.kintex.system;

import com.zioinfo.kintex.auth.KintexPrincipal;
import com.zioinfo.kintex.common.error.ApiException;
import com.zioinfo.kintex.common.error.ErrorCode;
import com.zioinfo.kintex.system.sysuser.SysUserMapper;
import org.springframework.stereotype.Component;

/**
 * 시스템관리(백오피스) 접근 가드 — 전역 ADMIN 축(이중 RBAC 중 플랫폼 역할).
 * <p>홀매니저(킨텍스 내부 운영/관리자)는 ADMIN으로 간주하고, 그 외에는 {@code app_user.role_code=ADMIN}을 조회한다.
 * 행사 스코프 권한은 {@code EventAccessGuard}가 담당(직교). /api/admin/** 은 본 가드로 게이트한다.
 */
@Component
public class SystemAccessGuard {

    private final SysUserMapper sysUserMapper;

    public SystemAccessGuard(SysUserMapper sysUserMapper) {
        this.sysUserMapper = sysUserMapper;
    }

    /** 인증 필수. */
    public KintexPrincipal require(KintexPrincipal principal) {
        if (principal == null) {
            throw new ApiException(ErrorCode.UNAUTHORIZED);
        }
        return principal;
    }

    /** 시스템관리자 필수(홀매니저 또는 전역 ADMIN). 아니면 403. */
    public KintexPrincipal requireAdmin(KintexPrincipal principal) {
        require(principal);
        if (principal.hallManager()) {
            return principal;
        }
        String role = sysUserMapper.findRoleCode(principal.userId());
        if (!"ADMIN".equals(role)) {
            throw new ApiException(ErrorCode.FORBIDDEN, "시스템관리 권한이 필요합니다.");
        }
        return principal;
    }

    /** 데이터 전체열람 가능 여부(홀매니저·MANAGER·ADMIN). 업무모듈 DataScope 판정용(비throw). */
    public boolean canSeeAll(KintexPrincipal principal) {
        if (principal == null) {
            return false;
        }
        if (principal.hallManager()) {
            return true;
        }
        String role = sysUserMapper.findRoleCode(principal.userId());
        return "ADMIN".equals(role) || "MANAGER".equals(role);
    }

    /** 매니저 이상(MANAGER/ADMIN 또는 홀매니저) — 팀 범위 관리 액션용. */
    public KintexPrincipal requireManager(KintexPrincipal principal) {
        require(principal);
        if (principal.hallManager()) {
            return principal;
        }
        String role = sysUserMapper.findRoleCode(principal.userId());
        if (!"ADMIN".equals(role) && !"MANAGER".equals(role)) {
            throw new ApiException(ErrorCode.FORBIDDEN);
        }
        return principal;
    }
}
