import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flux/core/enums/enums.dart'; import 'package:flux/features/company/models/company_model.dart'; import 'package:flux/features/master_data/store/models/store_model.dart'; import 'package:get_it/get_it.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'dart:async'; import 'package:supabase_flutter/supabase_flutter.dart'; part 'session_events.dart'; part 'session_state.dart'; class SessionBloc extends Bloc { final SupabaseClient _supabase = GetIt.I.get(); StreamSubscription? _authSubscription; SessionBloc() : super(const SessionState(status: SessionStatus.unknown)) { on((event, emit) { // 1. Controlla la sessione attuale al boot final session = _supabase.auth.currentSession; if (session != null) { add(UserChanged(session.user.id)); } else { add(UserChanged(null)); } // 2. Ascolta i cambiamenti futuri (login, logout, token scaduto) _authSubscription = _supabase.auth.onAuthStateChange.listen((data) { final userId = data.session?.user.id; add(UserChanged(userId)); }); }); on((event, emit) async { if (event.userId == null) { emit(SessionState(status: SessionStatus.unauthenticated)); return; } // 1. Controlla se l'utente ha una Company final companyJson = await _supabase .from('company') .select() .eq('user_id', event.userId!) .maybeSingle(); if (companyJson == null) { emit( SessionState( status: SessionStatus.authenticatedNoCompany, userId: event.userId, ), ); return; } CompanyModel company = CompanyModel.fromJson(companyJson); // 2. Controlla i negozi final stores = await _supabase .from('store') .select() .eq('company_id', companyJson['id']); if (stores.isEmpty) { emit( SessionState( status: SessionStatus.authenticatedNoStore, userId: event.userId, company: company, ), ); return; } final availableStores = stores .map((s) => StoreModel.fromJson(s)) .toList(); // 3. Tutto ok, gestiamo le SharedPreferences per il negozio final prefs = GetIt.I.get(); String? lastStoreId = prefs.getString(PrefKeys.lastStore.value); // Se non c'รจ nelle SharedPreferences, prendi il primo della lista if (lastStoreId == null || !stores.any((s) => s['id'] == lastStoreId)) { lastStoreId = stores.first['id']; await prefs.setString('last_store_id', lastStoreId!); } final selectedStore = StoreModel.fromJson( stores.firstWhere((s) => s['id'] == lastStoreId), ); emit( SessionState( status: SessionStatus.ready, userId: event.userId, company: company, selectedStore: selectedStore, availableStores: availableStores, ), ); }); } @override Future close() { _authSubscription?.cancel(); return super.close(); } }