import 'dart:convert'; import 'package:photos/models/file/file.dart'; import 'package:photos/services/collections_service.dart'; class DuplicateFilesResponse { final List sameSizeFiles; DuplicateFilesResponse(this.sameSizeFiles); factory DuplicateFilesResponse.fromMap(Map map) { return DuplicateFilesResponse( List.from( map['duplicates']?.map((x) => FileWithSameSize.fromMap(x)), ), ); } Map toUploadIDToSize() { final Map result = {}; for (final filesWithSameSize in sameSizeFiles) { for (final uploadID in filesWithSameSize.fileIDs) { result[uploadID] = filesWithSameSize.size; } } return result; } factory DuplicateFilesResponse.fromJson(String source) => DuplicateFilesResponse.fromMap(json.decode(source)); @override String toString() => 'DuplicateFiles(sameSizeFiles: $sameSizeFiles)'; } class FileWithSameSize { final List fileIDs; final int size; FileWithSameSize(this.fileIDs, this.size); factory FileWithSameSize.fromMap(Map map) { return FileWithSameSize( List.from(map['fileIDs']), map['size'], ); } factory FileWithSameSize.fromJson(String source) => FileWithSameSize.fromMap(json.decode(source)); @override String toString() => 'Duplicates(fileIDs: $fileIDs, size: $size)'; } class DuplicateFiles { final List files; final int size; final Set collectionIDs; static final collectionsService = CollectionsService.instance; DuplicateFiles( this.files, this.size, this.collectionIDs, ) { sortByCollectionName(); } // sortByLocalIDs sorts the files such that files with localID are at the top List sortByLocalIDs() { final List filesWithoutLocalID = []; final List localFiles = []; for (final file in files) { if ((file.localID ?? '').isEmpty) { localFiles.add(file); } else { filesWithoutLocalID.add(file); } } localFiles.addAll(filesWithoutLocalID); return localFiles; } @override String toString() => 'DuplicateFiles(files: $files, size: $size)'; sortByCollectionName() { files.sort((first, second) { final firstName = collectionsService .getCollectionByID(first.collectionID!)! .displayName; final secondName = collectionsService .getCollectionByID(second.collectionID!)! .displayName; return firstName.compareTo(secondName); }); } }