Files
flux/lib/features/onboarding/blocs/onboarding_cubit.dart

114 lines
3.8 KiB
Dart

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<OnboardingState> {
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<void> saveCompany(String companyName) async {
emit(state.copyWith(isLoading: true));
final company = CompanyModel.empty().copyWith(
name: companyName,
userId: GetIt.I<SupabaseClient>().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<void> 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<void> 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"),
);
}
}
}