import 'package:flutter/widgets.dart';
import 'package:get_it/get_it.dart';
import 'package:go_router/go_router.dart';

import '../permissions/permission_manager.dart';

typedef RouteGuard = String? Function(BuildContext, GoRouterState);

/// 라우트 접근 시 권한을 검사하는 가드.
class AuthGuard {
  const AuthGuard._();

  /// [resource]와 [action]에 대한 접근 권한을 확인한다.
  static bool can(
    String resource, {
    PermissionAction action = PermissionAction.view,
  }) {
    if (!GetIt.I.isRegistered<PermissionManager>()) {
      return false;
    }
    return GetIt.I<PermissionManager>().can(resource, action);
  }

  /// 권한이 없을 경우 [fallback] 경로로 리다이렉트하는 Guard를 생성한다.
  static RouteGuard require({
    required String resource,
    PermissionAction action = PermissionAction.view,
    required String fallback,
  }) {
    return (context, state) {
      if (!GetIt.I.isRegistered<PermissionManager>()) {
        return null;
      }
      final manager = GetIt.I<PermissionManager>();
      final allowed = manager.can(resource, action);
      return allowed ? null : fallback;
    };
  }
}
