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"),
      );
    }
  }
}
