import 'dart:async'; // Serve per il Timer del debounce
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:flux/core/blocs/session/session_cubit.dart';
import 'package:flux/features/customers/data/customer_repository.dart';
import 'package:flux/features/customers/models/customer_model.dart';
import 'package:get_it/get_it.dart';

part 'customers_list_state.dart';

class CustomersListCubit extends Cubit<CustomersListState> {
  final CustomerRepository _repository = GetIt.I<CustomerRepository>();
  final SessionCubit _sessionCubit = GetIt.I<SessionCubit>();

  // Variabile per gestire il debounce della ricerca
  Timer? _searchDebounce;

  CustomersListCubit() : super(const CustomersListState());

  // --- LETTURA ---
  Future<void> loadCustomers() async {
    emit(state.copyWith(status: CustomersListStatus.loading));
    try {
      final customers = await _repository.getCustomers(
        _sessionCubit.state.company!.id!,
      );
      emit(
        state.copyWith(
          status: CustomersListStatus.success,
          customers: customers,
        ),
      );
    } catch (e) {
      emit(
        state.copyWith(
          status: CustomersListStatus.failure,
          errorMessage: e.toString(),
        ),
      );
    }
  }

  // --- RICERCA CON DEBOUNCE ---
  void searchCustomers(String query) {
    // 1. Se c'è già una ricerca in attesa (l'utente sta digitando veloce), la annulliamo
    if (_searchDebounce?.isActive ?? false) _searchDebounce!.cancel();

    // 2. Facciamo partire un timer di 400 millisecondi
    _searchDebounce = Timer(const Duration(milliseconds: 300), () async {
      // Se cancella tutto e la query è vuota, ricarichiamo la lista base
      if (query.trim().isEmpty) {
        await loadCustomers();
        return;
      }

      // Nessun "loading" state qui, per evitare sfarfallii visivi mentre si scrive
      try {
        final results = await _repository.searchCustomers(
          _sessionCubit.state.company!.id!,
          query,
        );
        emit(
          state.copyWith(
            status: CustomersListStatus.success,
            customers: results,
          ),
        );
      } catch (e) {
        emit(
          state.copyWith(
            status: CustomersListStatus.failure,
            errorMessage: e.toString(),
          ),
        );
      }
    });
  }

  // Pulizia della memoria quando il Cubit viene distrutto
  @override
  Future<void> close() {
    _searchDebounce?.cancel();
    return super.close();
  }
}
