import 'package:supabase_flutter/supabase_flutter.dart'; import '../constants/app_constants.dart'; class SupabaseService { static SupabaseClient get _supabase => Supabase.instance.client; // Initialize Supabase static Future initialize() async { try { print('DEBUG: Inicializando Supabase...'); await Supabase.initialize( url: AppConstants.supabaseUrl, anonKey: AppConstants.supabaseAnonKey, ); print('DEBUG: Supabase inicializado com sucesso!'); } catch (e) { print('DEBUG: Erro ao inicializar Supabase: $e'); rethrow; } } // Get current user static User? get currentUser => _supabase.auth.currentUser; // Sign up with email and password static Future signUp({ required String email, required String password, required String name, }) async { try { final response = await _supabase.auth.signUp( email: email, password: password, data: {'name': name}, ); if (response.user != null) { return response; } else { throw Exception('Falha ao criar usuário.'); } } catch (e) { throw Exception('Erro ao criar conta: $e'); } } // Sign in with email and password static Future signIn({ required String email, required String password, }) async { try { return await _supabase.auth.signInWithPassword( email: email, password: password, ); } catch (e) { throw Exception('Erro ao fazer login: $e'); } } // Sign out static Future signOut() async { try { await _supabase.auth.signOut(); } catch (e) { throw Exception('Erro ao sair: $e'); } } // Reset password static Future resetPassword(String email) async { try { await _supabase.auth.resetPasswordForEmail(email); } catch (e) { throw Exception('Erro ao redefinir senha: $e'); } } // Update user profile static Future updateProfile({String? name, String? email}) async { try { final updates = {}; if (name != null) updates['name'] = name; final userAttributes = UserAttributes( data: updates.isNotEmpty ? updates : null, email: email, ); await _supabase.auth.updateUser(userAttributes); } catch (e) { throw Exception('Erro ao atualizar perfil: $e'); } } // Test connection to Supabase static Future testConnection() async { try { final session = _supabase.auth.currentSession; return true; } catch (e) { return false; } } // Listen to auth state changes static Stream get authStateChanges => _supabase.auth.onAuthStateChange; // Save a new run static Future saveRun({ required double distance, required double pace, required int duration, }) async { try { final userId = currentUser?.id; if (userId == null) { throw Exception('Usuário não autenticado'); } // Insert new run await _supabase.from('runs').insert({ 'id_user': userId, 'distance': distance, 'pace': pace, 'created_at': DateTime.now().toIso8601String(), }); // Update user stats await _updateUserStats(userId, distance, pace); } catch (e) { throw Exception('Erro ao salvar corrida: $e'); } } // Update user statistics static Future _updateUserStats( String userId, double newDistance, double newPace, ) async { try { // Get current user stats final currentStats = await _supabase .from('user_stats') .select('best_pace, max_distance') .eq('id_user', userId) .maybeSingle(); if (currentStats == null) { // Create new user stats record await _supabase.from('user_stats').insert({ 'id_user': userId, 'best_pace': newPace, 'max_distance': newDistance, 'created_at': DateTime.now().toIso8601String(), }); } else { // Update if new records are better final updates = {}; if (currentStats['max_distance'] == null || newDistance > currentStats['max_distance']) { updates['max_distance'] = newDistance; } if (currentStats['best_pace'] == null || newPace < currentStats['best_pace']) { updates['best_pace'] = newPace; } if (updates.isNotEmpty) { await _supabase .from('user_stats') .update(updates) .eq('id_user', userId); } } } catch (e) { throw Exception('Erro ao atualizar estatísticas: $e'); } } // Get user statistics static Future?> getUserStats() async { try { final userId = currentUser?.id; if (userId == null) { throw Exception('Usuário não autenticado'); } return await _supabase .from('user_stats') .select('*') .eq('id_user', userId) .maybeSingle(); } catch (e) { throw Exception('Erro ao buscar estatísticas: $e'); } } // Get user runs history static Future>> getUserRuns({ int limit = 50, }) async { try { final userId = currentUser?.id; if (userId == null) { throw Exception('Usuário não autenticado'); } return await _supabase .from('runs') .select('*') .eq('id_user', userId) .order('created_at', ascending: false) .limit(limit); } catch (e) { throw Exception('Erro ao buscar histórico de corridas: $e'); } } }