import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flux/core/blocs/session/session_cubit.dart'; import 'package:flux/core/data/core_repository.dart'; import 'package:flux/features/company/models/company_model.dart'; import 'package:flux/features/master_data/staff/models/staff_member_model.dart'; import 'package:flux/features/master_data/store/models/store_model.dart'; import 'package:flux/features/onboarding/blocs/onboarding_state.dart'; import 'package:get_it/get_it.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; class OnboardingCubit extends Cubit { final CoreRepository _repository; final SessionCubit _sessionCubit; OnboardingCubit(this._sessionCubit, this._repository) : super( OnboardingState( step: _sessionCubit.state.onboardingStep, companyId: _sessionCubit.state.company?.id, storeId: _sessionCubit.state.currentStore?.id, ), ); // --- STEP 1: REGISTRAZIONE AZIENDA --- Future saveCompany(String companyName) async { emit(state.copyWith(isLoading: true)); final company = CompanyModel.empty().copyWith( name: companyName, userId: GetIt.I().auth.currentUser!.id, subscriptionTier: SubscriptionTier.pro, subscriptionStatus: SubscriptionStatus.trialing, trialEndsAt: DateTime.now().add(const Duration(days: 14)), ); try { // Il repository restituisce il modello creato con l'ID di Supabase final savedCompany = await _repository.createCompany(company); emit( state.copyWith( isLoading: false, step: OnboardingStep.store, companyId: savedCompany.id, ), ); } catch (e) { emit( state.copyWith( isLoading: false, error: "Errore salvataggio azienda: $e", ), ); } } // --- STEP 2: REGISTRAZIONE PRIMO NEGOZIO --- Future saveStore(StoreModel store) async { if (state.companyId == null) return; if (state.companyId == '') return; emit(state.copyWith(isLoading: true)); try { // Iniettiamo forzatamente il companyId ottenuto dallo step precedente final storeToSave = store.copyWith(companyId: state.companyId); final savedStore = await _repository.createStore(storeToSave); _sessionCubit.changeStore(savedStore); emit( state.copyWith( isLoading: false, step: OnboardingStep.staff, storeId: savedStore.id, ), ); } catch (e) { emit( state.copyWith(isLoading: false, error: "Errore salvataggio store: $e"), ); } } // --- STEP 3: REGISTRAZIONE PROFILO STAFF (PAZIENTE ZERO) --- Future saveStaff(StaffMemberModel staff) async { if (state.companyId == null) return; if (state.companyId == '') return; emit(state.copyWith(isLoading: true)); try { // PARANOIA MODE: Forziamo i legami e il ruolo di sistema 'admin' final staffToSave = staff.copyWith( companyId: state.companyId!, userId: _sessionCubit.state.user!.id, systemRole: SystemRole.admin, ); // 1. Salviamo lo staff e CI FACCIAMO RESTITUIRE IL MODELLO (con l'id generato!) final savedStaff = await _repository.createStaffMember(staffToSave); // 2. LA MAGIA: Colleghiamo il Paziente Zero al Negozio appena creato! if (state.storeId != null && savedStaff.id != null) { await _repository.assignStaffToStore(savedStaff.id!, state.storeId!); } emit(state.copyWith(isLoading: false, step: OnboardingStep.completed)); // Svegliamo il SessionCubit: lui ricalcolerà tutto e aprirà la Dashboard await _sessionCubit.initializeSession(); } catch (e) { emit( state.copyWith(isLoading: false, error: "Errore creazione profilo: $e"), ); } } }