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

/// 로그인 응답에서 내려오는 단일 권한(리소스 + 액션 목록)을 표현한다.
class AuthPermission {
  const AuthPermission({required this.resource, required this.actions});

  /// 서버가 반환한 리소스 식별자 (예: `/stock-transactions`)
  final String resource;

  /// 허용된 액션 문자열 목록 (예: `view`, `create`)
  final List<String> actions;

  /// [PermissionManager]가 이해할 수 있는 포맷으로 변환한다.
  Map<String, Set<PermissionAction>> toPermissionMap() {
    final normalized = PermissionResources.normalize(resource);
    final actionSet = <PermissionAction>{};
    final isScope = normalized.startsWith('scope:');
    for (final raw in actions) {
      final parsed = _parseAction(raw);
      if (parsed == null) {
        continue;
      }
      actionSet.add(parsed);
    }
    if (actionSet.isEmpty && isScope) {
      actionSet.add(PermissionAction.view);
    }
    if (actionSet.isEmpty) {
      return <String, Set<PermissionAction>>{};
    }
    return {normalized: actionSet};
  }

  /// 백엔드 권한 문자열을 [PermissionAction]으로 변환한다.
  ///
  /// - 백엔드 스펙(`create`, `read`, `update`, `delete`, `restore`, `approve`)과
  ///   프런트 내부 별칭(`view`, `edit`)을 모두 인식한다.
  /// - 인식할 수 없는 문자열은 무시해 잘못된 권한이 섞여도 앱이 중단되지 않도록 한다.
  PermissionAction? _parseAction(String raw) {
    final key = raw.trim().toLowerCase();
    return _actionMap[key];
  }

  static const Map<String, PermissionAction> _actionMap = {
    'view': PermissionAction.view,
    'read': PermissionAction.view,
    'create': PermissionAction.create,
    'edit': PermissionAction.edit,
    'update': PermissionAction.edit,
    'delete': PermissionAction.delete,
    'restore': PermissionAction.restore,
    'approve': PermissionAction.approve,
  };
}
