import 'package:flutter_bloc/flutter_bloc.dart'; import '../models/models.dart'; import 'app_event.dart'; import 'app_state.dart'; class AppBloc extends Bloc { AppBloc() : super(AppState(books: _initialBooks)) { on(_onScreenChanged); on(_onBookClicked); on(_onAddBookClicked); on(_onBookSaved); on(_onBookDeleted); on(_onBookDetected); on(_onSearchChanged); } static List get _initialBooks => [ createBook( id: '1', title: 'Великий Гэтсби', author: 'Ф. Скотт Фицджеральд', genre: 'Classic', annotation: 'История о несбывшейся любви и трагедии американской мечты на фоне бурных двадцатых годов.', coverUrl: 'https://picsum.photos/seed/gatsby/400/600', pages: 208, language: 'English', publishedYear: 1925, rating: 4.8, status: BookStatus.reading, progress: 45, isFavorite: true, ), createBook( id: '2', title: '1984', author: 'Джордж Оруэлл', genre: 'Dystopian', annotation: 'Антиутопия о тоталитарном государстве, где мысли контролируются, а правда переменчива.', coverUrl: 'https://picsum.photos/seed/1984/400/600', pages: 328, language: 'English', publishedYear: 1949, rating: 4.9, status: BookStatus.wantToRead, isFavorite: true, ), createBook( id: '3', title: 'Дюна', author: 'Фрэнк Герберт', genre: 'Sci-Fi', annotation: 'Эпическая сага о борьбе за власть над самой важной планетой во Вселенной.', coverUrl: 'https://picsum.photos/seed/dune/400/600', pages: 896, language: 'English', publishedYear: 1965, rating: 4.7, status: BookStatus.reading, progress: 12, isFavorite: false, ), createBook( id: '4', title: 'Хоббит', author: 'Дж. Р. Р. Толкин', genre: 'Fantasy', annotation: 'Путешествие Бильбо Бэггинса туда и обратно в поисках сокровищ гномов.', coverUrl: 'https://picsum.photos/seed/hobbit/400/600', pages: 310, language: 'English', publishedYear: 1937, rating: 4.9, status: BookStatus.done, isFavorite: false, ), ]; void _onScreenChanged(ScreenChanged event, Emitter emit) { emit(state.copyWith(currentScreen: event.screen)); } void _onBookClicked(BookClicked event, Emitter emit) { emit(state.copyWith( selectedBook: event.book, currentScreen: AppScreen.details, )); } void _onAddBookClicked(AddBookClicked event, Emitter emit) { emit(state.copyWith( prefilledData: null, selectedBook: null, currentScreen: AppScreen.addBook, )); } void _onBookSaved(BookSaved event, Emitter emit) { final bookData = event.bookData; if (state.selectedBook != null) { // Edit existing book final updatedBooks = state.books.map((book) { if (book.id == state.selectedBook!.id) { return book.copyWith( title: bookData['title'] as String? ?? book.title, author: bookData['author'] as String? ?? book.author, genre: bookData['genre'] as String? ?? book.genre, annotation: bookData['annotation'] as String? ?? book.annotation, coverUrl: bookData['coverUrl'] as String?, pages: bookData['pages'] as int?, language: bookData['language'] as String?, publishedYear: bookData['publishedYear'] as int?, rating: bookData['rating'] as double?, status: bookData['status'] as BookStatus? ?? book.status, progress: bookData['progress'] as int?, isFavorite: bookData['isFavorite'] as bool? ?? book.isFavorite, ); } return book; }).toList(); emit(state.copyWith( books: updatedBooks, currentScreen: AppScreen.library, selectedBook: null, prefilledData: null, )); } else { // Add new book final newBook = createBook( id: DateTime.now().millisecondsSinceEpoch.toString(), title: bookData['title'] as String? ?? 'Unknown', author: bookData['author'] as String? ?? 'Unknown', genre: bookData['genre'] as String? ?? 'Unknown', annotation: bookData['annotation'] as String? ?? '', coverUrl: bookData['coverUrl'] as String? ?? 'https://picsum.photos/seed/${DateTime.now().millisecondsSinceEpoch}/400/600', pages: bookData['pages'] as int?, language: bookData['language'] as String?, publishedYear: bookData['publishedYear'] as int?, rating: bookData['rating'] as double?, status: bookData['status'] as BookStatus? ?? BookStatus.wantToRead, progress: bookData['progress'] as int?, isFavorite: bookData['isFavorite'] as bool? ?? false, ); emit(state.copyWith( books: [...state.books, newBook], currentScreen: AppScreen.library, selectedBook: null, prefilledData: null, )); } } void _onBookDeleted(BookDeleted event, Emitter emit) { final updatedBooks = state.books.where((book) => book.id != event.id).toList(); emit(state.copyWith( books: updatedBooks, currentScreen: AppScreen.library, selectedBook: null, )); } void _onBookDetected(BookDetected event, Emitter emit) { emit(state.copyWith( prefilledData: event.bookData, currentScreen: AppScreen.addBook, )); } void _onSearchChanged(SearchChanged event, Emitter emit) { emit(state.copyWith(searchQuery: event.query)); } }