import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/enums.dart';
import 'package:immich_mobile/models/folder/root_folder.model.dart';
import 'package:immich_mobile/services/folder.service.dart';
import 'package:immich_mobile/widgets/asset_grid/asset_grid_data_structure.dart';
import 'package:logging/logging.dart';

class FolderStructureNotifier extends StateNotifier<AsyncValue<RootFolder>> {
  final FolderService _folderService;
  final Logger _log = Logger("FolderStructureNotifier");

  FolderStructureNotifier(this._folderService) : super(const AsyncLoading());

  Future<void> fetchFolders(SortOrder order) async {
    try {
      final folders = await _folderService.getFolderStructure(order);
      state = AsyncData(folders);
    } catch (e, stack) {
      _log.severe("Failed to build folder structure", e, stack);
      state = AsyncError(e, stack);
    }
  }
}

final folderStructureProvider =
    StateNotifierProvider<FolderStructureNotifier, AsyncValue<RootFolder>>(
        (ref) {
  return FolderStructureNotifier(
    ref.watch(folderServiceProvider),
  );
});

class FolderRenderListNotifier extends StateNotifier<AsyncValue<RenderList>> {
  final FolderService _folderService;
  final RootFolder _folder;
  final Logger _log = Logger("FolderAssetsNotifier");

  FolderRenderListNotifier(this._folderService, this._folder)
      : super(const AsyncLoading());

  Future<void> fetchAssets(SortOrder order) async {
    try {
      final assets = await _folderService.getFolderAssets(_folder, order);
      final renderList =
          await RenderList.fromAssets(assets, GroupAssetsBy.none);
      state = AsyncData(renderList);
    } catch (e, stack) {
      _log.severe("Failed to fetch folder assets", e, stack);
      state = AsyncError(e, stack);
    }
  }
}

final folderRenderListProvider = StateNotifierProvider.family<
    FolderRenderListNotifier,
    AsyncValue<RenderList>,
    RootFolder>((ref, folder) {
  return FolderRenderListNotifier(
    ref.watch(folderServiceProvider),
    folder,
  );
});