import 'package:flutter/foundation.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:shared_preferences/shared_preferences.dart'; class DbGrupSekolah { static final supabase = Supabase.instance.client; static Future getUserIdAsync() async { final prefs = await SharedPreferences.getInstance(); final ortuId = prefs.getString('user_id_admin'); if (ortuId != null) return ortuId; final id = supabase.auth.currentUser?.id; if (id != null) return id; throw Exception('User belum login'); } // Determine current user's role and corresponding table ID static Future?> getCurrentUserRoleAndId() async { try { final prefs = await SharedPreferences.getInstance(); final role = prefs.getString('user_role'); // 1. Cek Ortu/Murid (menggunakan SharedPreferences) if (role == 'ortu' || role == 'murid') { final nis = prefs.getString('murid_nis'); final adminId = prefs.getString('user_id_admin'); if (nis != null && adminId != null) { final muridRes = await supabase .from('murid') .select('id_tabel') .eq('user_id', adminId) .eq('nis', nis) .or('status_akun.is.null,status_akun.eq.true') .maybeSingle(); if (muridRes != null) { return {'role': 'murid', 'id': muridRes['id_tabel'].toString()}; } } return null; } // 2. Cek Guru (menggunakan SharedPreferences) if (role == 'guru') { final nik = prefs.getString('guru_nik'); final adminId = prefs.getString('user_id_admin'); if (nik != null && adminId != null) { final guruRes = await supabase .from('guru') .select('id_tabel, status_akun') .eq('user_id', adminId) .eq('nik', nik) .maybeSingle(); if (guruRes != null && guruRes['status_akun'] != false) { return {'role': 'guru', 'id': guruRes['id_tabel'].toString()}; } } return null; } // 3. Cek Admin (menggunakan Supabase Auth) final userId = supabase.auth.currentUser?.id; if (userId == null) return null; final adminRes = await supabase .from('user_admin') .select('id') .eq('id', userId) .maybeSingle(); if (adminRes != null) { return {'role': 'admin', 'id': adminRes['id'].toString()}; } } catch (e) { if (kDebugMode) print('Check Role Error: $e'); } return null; } // Ambil semua nama (Admin, Guru, Murid) untuk ditampilkan di chat static Future> fetchAllNames() async { final Map namesMap = {}; try { // Fetch Admin names final admins = await supabase.from('user_admin').select('id, name'); for (var a in admins) { if (a['id'] != null && a['name'] != null) { namesMap[a['id'].toString()] = a['name'].toString(); } } // Fetch Guru names final gurus = await supabase .from('guru') .select('id_tabel, name') .or('status_akun.is.null,status_akun.eq.true'); for (var g in gurus) { if (g['id_tabel'] != null && g['name'] != null) { namesMap[g['id_tabel'].toString()] = g['name'].toString(); } } // Fetch Murid names final murids = await supabase .from('murid') .select('id_tabel, nama') .or('status_akun.is.null,status_akun.eq.true'); for (var m in murids) { if (m['id_tabel'] != null && m['nama'] != null) { namesMap[m['id_tabel'].toString()] = m['nama'].toString(); } } } catch (e) { if (kDebugMode) print('Fetch Names Error: $e'); } return namesMap; } // Stream chat global Stream>> getGrupSekolahStream() { return supabase .from('grup_sekolah') .stream(primaryKey: ['id_tabel']) .order('created_at', ascending: true); } // Kirim Pesan Future sendMessage({ required String text, required String senderId, required String role, }) async { try { final userId = await getUserIdAsync(); final Map insertData = { 'text': text, 'user_id': userId, }; if (role == 'admin') { insertData['pengirim_admin'] = senderId; } else if (role == 'guru') { insertData['pengirim_guru'] = senderId; } else if (role == 'murid') { insertData['pengirim_murid'] = senderId; } await supabase.from('grup_sekolah').insert(insertData); } catch (e) { if (kDebugMode) print('Send Message Error: $e'); throw Exception('Gagal mengirim pesan: $e'); } } }