/*
 * 관리자 백오피스(M18) 프론트 RBAC 가드 — 방어 심층화(Defense-in-depth).
 * 백엔드 SystemAccessGuard.requireAdmin 이 최종 권위(홀매니저 || app_user.role_code=ADMIN)이며,
 * 이 컴포넌트는 비관리자에게 관리자 화면 UI 를 노출하지 않기 위한 프론트 게이트다.
 *
 * ★ 판정 근거: authStore(AuthUser)는 이제 전역 role_code(app_user.role_code)를 순증 노출한다.
 *   프론트 관리자 신호 = roleCode==='ADMIN' || roleCode==='MANAGER' || hallManager===true,
 *   보조 폴백으로 현재 행사 역할 HALL_MANAGER. roleCode 는 로그인 응답 user.roleCode 로 전달된다
 *   (관람객 등 미지정 계정은 null → 비관리자). 백엔드 SystemAccessGuard.requireAdmin 이 최종 권위이며,
 *   이 게이트는 UI 노출 차단(방어 심층화) 목적이다. (기존 hallManager 단독 판정의 전역 ADMIN/MANAGER
 *   식별 불가 한계는 roleCode 순증으로 해소.)
 *
 * 사용(통합자 배선): 관리자 라우트 element 를 <AdminGuard> 로 감싼다. App.tsx 는 이 트랙에서 수정하지 않는다.
 */
import type { ReactNode } from 'react';
import { useTranslation } from 'react-i18next';
import { useAuthStore } from '../../store/authStore';
import { IconBlock } from '../../components/ui/icons';
import './admin-modules.css';

/** 프론트에서 확인 가능한 관리자 접근 여부(백엔드가 최종 권위). */
export function useIsAdmin(): boolean {
  const user = useAuthStore((s) => s.user);
  const roleForCurrent = useAuthStore((s) => s.roleForCurrent);
  if (!user) return false;
  const role = (user.roleCode ?? '').toUpperCase();
  if (role === 'ADMIN' || role === 'MANAGER') return true;
  if (user.hallManager) return true;
  return roleForCurrent() === 'HALL_MANAGER'; // 폴백: 현재 행사 홀매니저 역할
}

export function AdminGuard({ children }: { children: ReactNode }) {
  const { t } = useTranslation();
  const authed = useAuthStore((s) => s.isAuthenticated);
  const isAdmin = useIsAdmin();

  if (authed && isAdmin) return <>{children}</>;

  return (
    <div className="kx-page kx-adm">
      <div className="kx-adm-denied" role="alert">
        <span className="kx-adm-denied__icon" aria-hidden="true">
          <IconBlock size={40} />
        </span>
        <h1 className="kx-adm-denied__title">{t('admin.deniedTitle')}</h1>
        <p className="kx-adm-denied__desc">
          {authed ? t('admin.deniedAuthed') : t('admin.deniedGuest')}
        </p>
        <p className="kx-adm-denied__code">403 · FORBIDDEN</p>
      </div>
    </div>
  );
}
