import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/providers/album/album.provider.dart';
import 'package:immich_mobile/providers/locale_provider.dart';
import 'package:immich_mobile/services/timeline.service.dart';
import 'package:immich_mobile/widgets/asset_grid/asset_grid_data_structure.dart';

final singleUserTimelineProvider = StreamProvider.family<RenderList, String?>(
  (ref, userId) {
    if (userId == null) {
      return const Stream.empty();
    }

    ref.watch(localeProvider);
    final timelineService = ref.watch(timelineServiceProvider);
    return timelineService.watchHomeTimeline(userId);
  },
  dependencies: [localeProvider],
);

final multiUsersTimelineProvider =
    StreamProvider.family<RenderList, List<String>>(
  (ref, userIds) {
    ref.watch(localeProvider);
    final timelineService = ref.watch(timelineServiceProvider);
    return timelineService.watchMultiUsersTimeline(userIds);
  },
  dependencies: [localeProvider],
);

final albumTimelineProvider =
    StreamProvider.autoDispose.family<RenderList, int>((ref, id) {
  final album = ref.watch(albumWatcher(id)).value;
  final timelineService = ref.watch(timelineServiceProvider);

  if (album != null) {
    return timelineService.watchAlbumTimeline(album);
  }

  return const Stream.empty();
});

final archiveTimelineProvider = StreamProvider<RenderList>((ref) {
  final timelineService = ref.watch(timelineServiceProvider);
  return timelineService.watchArchiveTimeline();
});

final favoriteTimelineProvider = StreamProvider<RenderList>((ref) {
  final timelineService = ref.watch(timelineServiceProvider);
  return timelineService.watchFavoriteTimeline();
});

final trashTimelineProvider = StreamProvider<RenderList>((ref) {
  final timelineService = ref.watch(timelineServiceProvider);
  return timelineService.watchTrashTimeline();
});

final allVideosTimelineProvider = StreamProvider<RenderList>((ref) {
  final timelineService = ref.watch(timelineServiceProvider);
  return timelineService.watchAllVideosTimeline();
});

final assetSelectionTimelineProvider = StreamProvider<RenderList>((ref) {
  final timelineService = ref.watch(timelineServiceProvider);
  return timelineService.watchAssetSelectionTimeline();
});

final assetsTimelineProvider =
    FutureProvider.family<RenderList, List<Asset>>((ref, assets) {
  final timelineService = ref.watch(timelineServiceProvider);
  return timelineService.getTimelineFromAssets(
    assets,
    null,
  );
});

final lockedTimelineProvider = StreamProvider<RenderList>((ref) {
  final timelineService = ref.watch(timelineServiceProvider);
  return timelineService.watchLockedTimelineProvider();
});