import 'package:get/get.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

/// Oldal-/funkció-szintű jogosultságok kezelése.
///
/// A jogosultságokat egy Supabase `app_permissions` tábla tárolja
/// (user_id + area), és a felhasználó a saját sorait olvashatja (RLS).
/// A service induláskor és bejelentkezéskor betölti a jelenlegi
/// felhasználó jogosultságait egy halmazba, amit a UI reaktívan figyel.
///
/// Bővíthető: új védett terület = új 'area' string (pl. 'admin'),
/// a UI a [can] getterrel kérdez rá — kódmódosítás nélkül. A tényleges
/// védelmet a Supabase-oldali RLS adja (a `contacts`/admin táblákon),
/// ez a service csak a UI-t vezérli (menüpont elrejtése, üzenet).
class PermissionService extends GetxService {
  static PermissionService get to => Get.find();

  static const areaContacts = 'contacts';
  static const areaAdmin = 'admin';

  SupabaseClient get _client => Supabase.instance.client;

  /// A jelenlegi felhasználó engedélyezett területei.
  final _areas = <String>{}.obs;
  final isLoaded = false.obs;

  bool can(String area) => _areas.contains(area);
  bool get canContacts => can(areaContacts);
  bool get canAdmin => can(areaAdmin);

  @override
  void onInit() {
    super.onInit();
    // Induláskor és minden auth-változáskor újratöltjük.
    reload();
    _client.auth.onAuthStateChange.listen((_) => reload());
  }

  Future<void> reload() async {
    final user = _client.auth.currentUser;
    if (user == null) {
      _areas.clear();
      isLoaded.value = true;
      return;
    }
    try {
      final rows = await _client
          .from('terepi_seged_app_permissions')
          .select('area')
          .eq('user_id', user.id);
      _areas
        ..clear()
        ..addAll(rows.map((r) => r['area'] as String));
    } catch (_) {
      // Hálózati hiba: nem adunk jogot (fail-closed), de nem is dobunk.
      _areas.clear();
    } finally {
      _areas.refresh();
      isLoaded.value = true;
    }
  }
}
