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( ragioneSociale: 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, // Dall'utente loggato in Supabase systemRole: SystemRole.admin, // Blindato! ); await _repository.createStaffMember(staffToSave); 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"), ); } } }