import 'package:be_happy/domain/entities/scooter.dart'; import 'package:be_happy/domain/usecase/get_scooter_by_title_usecase.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:geolocator/geolocator.dart'; import 'package:yandex_mapkit/yandex_mapkit.dart'; import '../../core/result.dart'; import '../../domain/usecase/get_address_by_point_usecase.dart'; import '../../domain/usecase/get_pedestrian_routes_usecase.dart'; import '../event/scooter_code_event.dart'; import '../state/scooter_code_state.dart'; class ScooterCodeBloc extends Bloc { final GetScooterByTitleUsecase getScooterByTitleUsecase; final GetAddressByPointUsecase getAddressUsecase; final GetPedestrianRoutesUsecase getPedestrianRoutesUsecase; ScooterCodeBloc({ required this.getScooterByTitleUsecase, required this.getAddressUsecase, required this.getPedestrianRoutesUsecase, }) : super(const ScooterCodeInitial()) { on((event, emit) { emit(ScooterCodeInitial(code: event.code)); }); on((event, emit) async { emit(ScooterCodeLoading(code: event.code)); final result = await getScooterByTitleUsecase(event.code); switch (result) { case Success(:final data): if (data != null) { final String currentAddress = await getAddressUsecase( data.longitude, data.latitude, ); final position = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.high, ); final routes = await getPedestrianRoutesUsecase( Point(latitude: position.latitude, longitude: position.longitude), Point(latitude: data.longitude, longitude: data.latitude), ); final distance = routes?.firstOrNull?.metadata.weight.walkingDistance.value; print("Distance is: $distance"); final time = routes?.firstOrNull?.metadata.weight.time.value; data.distance = distance; data.timeToTravel = time; emit( ScooterCodeSuccess( data, code: event.code, address: currentAddress, distance: distance ?? 0.0, ), ); } else { emit(ScooterCodeFailure("Самокат не найден", code: event.code)); } case Failure(:final failure): emit( ScooterCodeFailure( failure.message ?? "Неизвестная ошибка", code: event.code, ), ); } }); } }