// Copyright (C) 2022 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.

import 'package:architecture_example/core/enums/fetch_status.dart';
import 'package:architecture_example/domain/repositories/photo_repository.dart';
import 'package:architecture_example/domain/usecases/photos/retrieve_all_albums.dart';
import 'package:architecture_example/presentation/features/albums/blocs/album/album_bloc.dart';
import 'package:architecture_example/presentation/features/albums/state_management/albums_wrapper_widget.dart';
import 'package:architecture_example/presentation/features/albums/state_management/widgets/albums_list.dart';
import 'package:flutter/material.dart';
import 'package:wyatt_bloc_helper/wyatt_bloc_helper.dart';

class AlbumsScreen extends BlocScreen<AlbumBloc, AlbumEvent, AlbumState> {
  const AlbumsScreen({super.key});

  @override
  AlbumBloc create(BuildContext context) =>
      AlbumBloc(RetrieveAllAlbums(repo<PhotoRepository>(context)));

  @override
  AlbumBloc init(BuildContext context, AlbumBloc bloc) =>
      bloc..add(AlbumFetched());

  @override
  Widget onWrap(BuildContext context, Widget child) => AlbumsWrapperWidget(
        child: child,
      );

  @override
  Widget onBuild(BuildContext context, AlbumState state) {
    switch (state.status) {
      case FetchStatus.initial:
        return const Center(child: CircularProgressIndicator());
      case FetchStatus.failure:
        return const Center(
          child: Text('failed to fetch albums'),
        );
      case FetchStatus.success:
        return AlbumsList(
          albums: state.albums,
          hasReachedMax: state.hasReachedMax,
        );
    }
  }
}
