import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/modules/album/models/asset_selection_state.model.dart';

import 'package:openapi/api.dart';

class AssetSelectionNotifier extends StateNotifier<AssetSelectionState> {
  AssetSelectionNotifier()
      : super(
          AssetSelectionState(
            selectedNewAssetsForAlbum: {},
            selectedMonths: {},
            selectedAdditionalAssetsForAlbum: {},
            selectedAssetsInAlbumViewer: {},
            isAlbumExist: false,
            isMultiselectEnable: false,
          ),
        );

  void setIsAlbumExist(bool isAlbumExist) {
    state = state.copyWith(isAlbumExist: isAlbumExist);
  }

  void removeAssetsInMonth(
    String removedMonth,
    List<AssetResponseDto> assetsInMonth,
  ) {
    Set<AssetResponseDto> currentAssetList = state.selectedNewAssetsForAlbum;
    Set<String> currentMonthList = state.selectedMonths;

    currentMonthList
        .removeWhere((selectedMonth) => selectedMonth == removedMonth);

    for (AssetResponseDto asset in assetsInMonth) {
      currentAssetList.removeWhere((e) => e.id == asset.id);
    }

    state = state.copyWith(
      selectedNewAssetsForAlbum: currentAssetList,
      selectedMonths: currentMonthList,
    );
  }

  void addAdditionalAssets(List<AssetResponseDto> assets) {
    state = state.copyWith(
      selectedAdditionalAssetsForAlbum: {
        ...state.selectedAdditionalAssetsForAlbum,
        ...assets
      },
    );
  }

  void addAllAssetsInMonth(String month, List<AssetResponseDto> assetsInMonth) {
    state = state.copyWith(
      selectedMonths: {...state.selectedMonths, month},
      selectedNewAssetsForAlbum: {
        ...state.selectedNewAssetsForAlbum,
        ...assetsInMonth
      },
    );
  }

  void addNewAssets(List<AssetResponseDto> assets) {
    state = state.copyWith(
      selectedNewAssetsForAlbum: {
        ...state.selectedNewAssetsForAlbum,
        ...assets
      },
    );
  }

  void removeSelectedNewAssets(List<AssetResponseDto> assets) {
    Set<AssetResponseDto> currentList = state.selectedNewAssetsForAlbum;

    for (AssetResponseDto asset in assets) {
      currentList.removeWhere((e) => e.id == asset.id);
    }

    state = state.copyWith(selectedNewAssetsForAlbum: currentList);
  }

  void removeSelectedAdditionalAssets(List<AssetResponseDto> assets) {
    Set<AssetResponseDto> currentList = state.selectedAdditionalAssetsForAlbum;

    for (AssetResponseDto asset in assets) {
      currentList.removeWhere((e) => e.id == asset.id);
    }

    state = state.copyWith(selectedAdditionalAssetsForAlbum: currentList);
  }

  void removeAll() {
    state = state.copyWith(
      selectedNewAssetsForAlbum: {},
      selectedMonths: {},
      selectedAdditionalAssetsForAlbum: {},
      selectedAssetsInAlbumViewer: {},
      isAlbumExist: false,
    );
  }

  void enableMultiselection() {
    state = state.copyWith(isMultiselectEnable: true);
  }

  void disableMultiselection() {
    state = state.copyWith(
      isMultiselectEnable: false,
      selectedAssetsInAlbumViewer: {},
    );
  }

  void addAssetsInAlbumViewer(List<AssetResponseDto> assets) {
    state = state.copyWith(
      selectedAssetsInAlbumViewer: {
        ...state.selectedAssetsInAlbumViewer,
        ...assets
      },
    );
  }

  void removeAssetsInAlbumViewer(List<AssetResponseDto> assets) {
    Set<AssetResponseDto> currentList = state.selectedAssetsInAlbumViewer;

    for (AssetResponseDto asset in assets) {
      currentList.removeWhere((e) => e.id == asset.id);
    }

    state = state.copyWith(selectedAssetsInAlbumViewer: currentList);
  }
}

final assetSelectionProvider =
    StateNotifierProvider<AssetSelectionNotifier, AssetSelectionState>((ref) {
  return AssetSelectionNotifier();
});