import 'package:supabase_flutter/supabase_flutter.dart'; class SupabaseService { static final SupabaseService _instance = SupabaseService._internal(); factory SupabaseService() => _instance; SupabaseService._internal(); final supabase = Supabase.instance.client; // --- Auth --- Future signUp(String email, String password, String fullName) async { final response = await supabase.auth.signUp( email: email, password: password, ); if (response.user != null) { // Insert into profiles table await supabase.from('profiles').insert({ 'id': response.user!.id, 'nama_lengkap': fullName, 'username': email.split('@')[0], }); } return response; } Future signIn(String email, String password) async { return await supabase.auth.signInWithPassword( email: email, password: password, ); } Future signOut() async { await supabase.auth.signOut(); } User? get currentUser => supabase.auth.currentUser; // --- Sensor Data (sensor_log) --- Future>> getSensorLogs() async { return await supabase .from('sensor_log') .select() .order('created_at', ascending: false) .limit(20); } // --- Limits (batas_sensor) --- Future?> getBatasSensor() async { final data = await supabase.from('batas_sensor').select().limit(1).single(); return data; } Future updateBatasSensor(double suhuMin, double suhuMax, double rhMin, double rhMax) async { await supabase.from('batas_sensor').update({ 'suhu_min': suhuMin, 'suhu_max': suhuMax, 'rh_min': rhMin, 'rh_max': rhMax, 'updated_at': DateTime.now().toIso8601String(), }).eq('id', 1); } // --- Interval (interval_setting) --- Future getIntervalSetting() async { final data = await supabase.from('interval_setting').select('durasi_menit').limit(1).single(); return data['durasi_menit'] as int; } Future updateIntervalSetting(int menit) async { await supabase.from('interval_setting').update({ 'durasi_menit': menit, 'update_at': DateTime.now().toIso8601String(), }).eq('id', 1); } // --- Gallery (foto_dataset) --- Future>> getFotoDataset() async { final List data = await supabase .from('foto_dataset') .select() .order('created_at', ascending: false); return List>.from(data); } // --- Log Fan Status --- Future logFanAction(String fan1, String fan2, double suhu, double hum, double lux) async { await supabase.from('sensor_log').insert({ 'kipas1': fan1, 'kipas2': fan2, 'suhu': suhu, 'kelembapan': hum, 'intensitas': lux, 'timestamp': DateTime.now().toString().substring(0, 19), }); } Future?> getLatestLog() async { final List data = await supabase .from('sensor_log') .select() .order('created_at', ascending: false) .limit(1); return data.isNotEmpty ? data.first as Map : null; } }