import 'package:flutter/foundation.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; class GuruService { static final supabase = Supabase.instance.client; static String get userId { final id = supabase.auth.currentUser?.id; if (id == null) { throw Exception('User belum login'); } return id; } // =============================== // 🔹 GET DATA GURU // =============================== static Future>> getGuru() async { try { final response = await supabase .from('guru') .select(''' id_tabel, nik, name, bidang, wali, id_class, created_at, class_name!guru_id_class_fkey ( id_tabel, name_class ) ''') .eq('user_id', userId) .or('status_akun.is.null,status_akun.eq.true') .order('name', ascending: true); return List>.from(response); } catch (e) { if (kDebugMode) { print('GET GURU ERROR: $e'); } throw Exception('Gagal memuat data guru: $e'); } } // =============================== // 🔹 GET DATA KELAS // =============================== static Future>> getKelas() async { try { final response = await supabase .from('class_name') .select('id_tabel, name_class') .eq('user_id', userId) .order('name_class'); return List>.from(response); } catch (e) { if (kDebugMode) { print('GET KELAS ERROR: $e'); } return []; } } // =============================== // 🔹 CHECK WALI KELAS // =============================== static Future checkWaliExists(String idClass, {String? excludeGuruId}) async { try { var query = supabase .from('guru') .select('id_tabel') .eq('user_id', userId) .eq('id_class', idClass) .eq('wali', true) .or('status_akun.is.null,status_akun.eq.true'); if (excludeGuruId != null) { query = query.neq('id_tabel', excludeGuruId); } final res = await query.limit(1); return res.isNotEmpty; } catch (e) { if (kDebugMode) { print('CHECK WALI ERROR: $e'); } throw Exception('Gagal mengecek status wali kelas'); } } static Future checkNikDuplicate(String nik, {String? excludeGuruId}) async { try { var query = supabase .from('guru') .select('id_tabel, status_akun') .eq('user_id', userId) .eq('nik', nik); if (excludeGuruId != null) { query = query.neq('id_tabel', excludeGuruId); } final res = await query.limit(1); if (res.isEmpty) return null; final bool statusAkun = res.first['status_akun'] == true; return statusAkun ? 'active' : 'deleted'; } catch (e) { if (kDebugMode) { print('CHECK NIK DUPLICATE ERROR: $e'); } throw Exception('Gagal mengecek NIK guru'); } } static Future checkNameDuplicate(String name, {String? excludeGuruId}) async { try { var query = supabase .from('guru') .select('id_tabel, status_akun') .eq('user_id', userId) .eq('name', name); if (excludeGuruId != null) { query = query.neq('id_tabel', excludeGuruId); } final res = await query.limit(1); if (res.isEmpty) return null; final bool statusAkun = res.first['status_akun'] == true; return statusAkun ? 'active' : 'deleted'; } catch (e) { if (kDebugMode) { print('CHECK NAME DUPLICATE ERROR: $e'); } throw Exception('Gagal mengecek nama guru'); } } // =============================== // 🔹 INSERT DATA GURU // =============================== static Future tambahGuru({ required String nik, required String name, String? bidang, String? idClass, required bool wali, }) async { try { if (wali && idClass == null) { throw Exception('Kelas harus dipilih jika menjadi Wali Kelas'); } final nikDup = await checkNikDuplicate(nik); if (nikDup == 'active') { throw Exception('NIK sudah terdaftar!'); } else if (nikDup == 'deleted') { throw Exception('NIK sudah terdaftar di Tempat Sampah! Silakan periksa Tempat Sampah untuk memulihkannya.'); } final nameDup = await checkNameDuplicate(name); if (nameDup == 'active') { throw Exception('Nama guru sudah terdaftar!'); } else if (nameDup == 'deleted') { throw Exception('Nama guru sudah terdaftar di Tempat Sampah! Silakan periksa Tempat Sampah untuk memulihkannya.'); } if (wali && idClass != null) { final exists = await checkWaliExists(idClass); if (exists) { throw Exception('Kelas ini sudah memiliki wali kelas!'); } } await supabase.from('guru').insert({ 'user_id': userId, 'nik': nik, 'name': name, 'bidang': bidang, 'id_class': idClass, 'wali': wali, 'status_akun': true, }); } catch (e) { if (kDebugMode) { print('ADD GURU ERROR: $e'); } rethrow; } } // =============================== // 🔹 UPDATE DATA GURU // =============================== static Future updateGuru({ required String idTabel, required String nik, required String name, String? bidang, String? idClass, required bool wali, }) async { try { if (wali && idClass == null) { throw Exception('Kelas harus dipilih jika menjadi Wali Kelas'); } final nikDup = await checkNikDuplicate(nik, excludeGuruId: idTabel); if (nikDup == 'active') { throw Exception('NIK sudah terdaftar!'); } else if (nikDup == 'deleted') { throw Exception('NIK sudah terdaftar di Tempat Sampah! Silakan periksa Tempat Sampah untuk memulihkannya.'); } final nameDup = await checkNameDuplicate(name, excludeGuruId: idTabel); if (nameDup == 'active') { throw Exception('Nama guru sudah terdaftar!'); } else if (nameDup == 'deleted') { throw Exception('Nama guru sudah terdaftar di Tempat Sampah! Silakan periksa Tempat Sampah untuk memulihkannya.'); } if (wali && idClass != null) { final exists = await checkWaliExists(idClass, excludeGuruId: idTabel); if (exists) { throw Exception('Kelas ini sudah memiliki wali kelas!'); } } await supabase.from('guru').update({ 'nik': nik, 'name': name, 'bidang': bidang, 'id_class': idClass, 'wali': wali, }).eq('id_tabel', idTabel).eq('user_id', userId); } catch (e) { if (kDebugMode) { print('UPDATE GURU ERROR: $e'); } rethrow; } } // =============================== // 🔹 DELETE DATA GURU // =============================== static Future deleteGuru(String idTabel) async { try { await supabase.from('guru').update({ 'status_akun': false, 'id_class': null, 'wali': false, }).eq('id_tabel', idTabel).eq('user_id', userId); } catch (e) { if (kDebugMode) { print('DELETE GURU ERROR: $e'); } rethrow; } } // =============================== // 🔹 GET DELETED GURU // =============================== static Future>> getDeletedGuru() async { try { final response = await supabase .from('guru') .select(''' id_tabel, nik, name, bidang, wali, id_class, created_at, class_name!guru_id_class_fkey ( id_tabel, name_class ) ''') .eq('user_id', userId) .eq('status_akun', false) .order('name', ascending: true); return List>.from(response); } catch (e) { if (kDebugMode) { print('GET DELETED GURU ERROR: $e'); } throw Exception('Gagal memuat data guru yang dihapus: $e'); } } // =============================== // 🔹 RESTORE DATA GURU // =============================== static Future restoreGuru(String idTabel) async { try { await supabase.from('guru').update({ 'status_akun': true, }).eq('id_tabel', idTabel).eq('user_id', userId); } catch (e) { if (kDebugMode) { print('RESTORE GURU ERROR: $e'); } rethrow; } } // =============================== // 🔹 DELETE DATA GURU PERMANENTLY // =============================== static Future deleteGuruPermanently(String idTabel) async { try { await supabase.from('guru').delete().eq('id_tabel', idTabel).eq('user_id', userId); } catch (e) { if (kDebugMode) { print('DELETE GURU PERMANENTLY ERROR: $e'); } rethrow; } } }