// lib/model/db/db.dart
import 'package:aves/model/covers.dart';
//import 'package:aves/model/dynamic_albums.dart';
import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/favourites.dart';
import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/metadata/address.dart';
import 'package:aves/model/metadata/catalog.dart';
import 'package:aves/model/metadata/trash.dart';
import 'package:aves/model/vaults/details.dart';
import 'package:aves/model/viewer/video_playback.dart';
import 'folder_stats.dart';

// 👇 serve per tipizzare il getter della connessione SQLite
import 'package:sqflite/sqflite.dart' show Database;

// 👇 serve per buildLocalFolders()
import 'package:aves/model/source/collection_source.dart';


abstract class LocalMediaDb {
  int get nextId;

  Future<Set<String>> getLocalFolderPaths();

  Future<Map<String, FolderStats>> buildFoldersInMemory(CollectionSource source);

  Future<void> saveFoldersBatch(List<FolderStats> folders);

  Future<String> get path;

  Future<void> init();

  Future<int> dbFileSize();

  Future<void> reset();

  Future<void> removeIds(Set<int> ids, {Set<EntryDataType>? dataTypes});

  Future<List<FolderStats>> loadFolders();


  // === Espone la connessione SQLite aperta dal loader (per il sync 4A) ===
  Database get rawDb;

  // ============================================================
  //   FOLDERS API (LOCAL) — AGGIUNTA
  // ============================================================





  // ============================================================
  //   ENTRIES
  // ============================================================

  Future<void> clearEntries();

  Future<Set<AvesEntry>> loadEntries({int? origin, String? directory});

  Future<Set<AvesEntry>> loadEntriesById(Set<int> ids);

  Future<void> insertEntries(Set<AvesEntry> entries);

  Future<void> updateEntry(int id, AvesEntry entry);

  Future<Set<AvesEntry>> searchLiveEntries(String query, {int? limit});

  Future<Set<AvesEntry>> searchLiveDuplicates(int origin, Set<AvesEntry>? entries);

  // ============================================================
  //   DATE TAKEN
  // ============================================================

  Future<void> clearDates();

  Future<Map<int?, int?>> loadDates();

  // ============================================================
  //   CATALOG METADATA
  // ============================================================

  Future<void> clearCatalogMetadata();

  Future<Set<CatalogMetadata>> loadCatalogMetadata();

  Future<Set<CatalogMetadata>> loadCatalogMetadataById(Set<int> ids);

  Future<void> saveCatalogMetadata(Set<CatalogMetadata> metadataEntries);

  Future<void> updateCatalogMetadata(int id, CatalogMetadata? metadata);

  // ============================================================
  //   ADDRESS
  // ============================================================

  Future<void> clearAddresses();

  Future<Set<AddressDetails>> loadAddresses();

  Future<Set<AddressDetails>> loadAddressesById(Set<int> ids);

  Future<void> saveAddresses(Set<AddressDetails> addresses);

  Future<void> updateAddress(int id, AddressDetails? address);

  // ============================================================
  //   VAULTS
  // ============================================================

  Future<void> clearVaults();

  Future<Set<VaultDetails>> loadAllVaults();

  Future<void> addVaults(Set<VaultDetails> rows);

  Future<void> updateVault(String oldName, VaultDetails row);

  Future<void> removeVaults(Set<VaultDetails> rows);

  // ============================================================
  //   TRASH
  // ============================================================

  Future<void> clearTrashDetails();

  Future<Set<TrashDetails>> loadAllTrashDetails();

  Future<void> updateTrash(int id, TrashDetails? details);

  // ============================================================
  //   FAVOURITES
  // ============================================================

  Future<void> clearFavourites();

  Future<Set<FavouriteRow>> loadAllFavourites();

  Future<void> addFavourites(Set<FavouriteRow> rows);

  Future<void> updateFavouriteId(int id, FavouriteRow row);

  Future<void> removeFavourites(Set<FavouriteRow> rows);

  // ============================================================
  //   COVERS
  // ============================================================

  Future<void> clearCovers();

  Future<Set<CoverRow>> loadAllCovers();

  Future<void> addCovers(Set<CoverRow> rows);

  Future<void> updateCoverEntryId(int id, CoverRow row);

  Future<void> removeCovers(Set<CollectionFilter> filters);


  // ============================================================
  //  VIDEO PLAYBACK
  // ============================================================

  Future<void> clearVideoPlayback();

  Future<Set<VideoPlaybackRow>> loadAllVideoPlayback();

  Future<VideoPlaybackRow?> loadVideoPlayback(int id);

  Future<void> addVideoPlayback(Set<VideoPlaybackRow> rows);

  Future<void> removeVideoPlayback(Set<int> ids);
}
