import 'package:flutter/foundation.dart'; import '../../models/data_models.dart'; import '../database_helper.dart'; /// 影视数据访问对象 class MovieDao { final DatabaseHelper _dbHelper = DatabaseHelper.instance; Future _wrap(String op, Future Function() fn) async { try { return await fn(); } catch (e) { debugPrint('[MovieDao] $op error: $e'); rethrow; } } // 获取所有影视记录(未删除的) Future> getAllMovies() => _wrap('getAllMovies', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'movies', where: 'is_deleted = ?', whereArgs: [0], orderBy: 'created_at DESC', ); return List.generate(maps.length, (i) => Movie.fromJson(maps[i])); }); // 分页查询影视记录 Future> getMoviesPaged({String? status, int limit = 20, int offset = 0, int sortMode = 0}) => _wrap('getMoviesPaged', () async { final db = await _dbHelper.database; String where = 'is_deleted = 0'; List whereArgs = []; if (status != null && status.isNotEmpty) { where += ' AND status = ?'; whereArgs.add(status); } final maps = await db.query('movies', where: where, whereArgs: whereArgs, orderBy: _buildMovieOrderBy(sortMode), limit: limit, offset: offset); return List.generate(maps.length, (i) => Movie.fromJson(maps[i])); }); static String _buildMovieOrderBy(int sortMode) { switch (sortMode) { case 1: return 'created_at DESC'; case 2: return 'rating DESC NULLS LAST, updated_at DESC'; default: return 'updated_at DESC'; } } // 根据状态筛选影视记录 Future> getMoviesByStatus(String status) => _wrap('getMoviesByStatus', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'movies', where: 'status = ? AND is_deleted = ?', whereArgs: [status, 0], orderBy: 'created_at DESC', ); return List.generate(maps.length, (i) => Movie.fromJson(maps[i])); }); // 根据导演筛选 Future> getMoviesByDirector(String director) => _wrap('getMoviesByDirector', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'movies', where: 'directors LIKE ? AND is_deleted = ?', whereArgs: ['%$director%', 0], orderBy: 'created_at DESC', ); return maps.map((m) => Movie.fromJson(m)) .where((movie) => movie.directors.contains(director)) .toList(); }); // 根据编剧筛选 Future> getMoviesByWriter(String writer) => _wrap('getMoviesByWriter', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'movies', where: 'writers LIKE ? AND is_deleted = ?', whereArgs: ['%$writer%', 0], orderBy: 'created_at DESC', ); return maps.map((m) => Movie.fromJson(m)) .where((movie) => movie.writers.contains(writer)) .toList(); }); // 根据演员筛选 Future> getMoviesByActor(String actor) => _wrap('getMoviesByActor', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'movies', where: 'actors LIKE ? AND is_deleted = ?', whereArgs: ['%$actor%', 0], orderBy: 'created_at DESC', ); return maps.map((m) => Movie.fromJson(m)) .where((movie) => movie.actors.contains(actor)) .toList(); }); // 根据类型筛选 Future> getMoviesByGenre(String genre) => _wrap('getMoviesByGenre', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'movies', where: 'genres LIKE ? AND is_deleted = ?', whereArgs: ['%$genre%', 0], orderBy: 'created_at DESC', ); return maps.map((m) => Movie.fromJson(m)) .where((movie) => movie.genres.contains(genre)) .toList(); }); // 搜索影视(标题或别名) Future> searchMovies(String keyword) => _wrap('searchMovies', () async { final db = await _dbHelper.database; final likeKeyword = '%$keyword%'; final List> maps = await db.query( 'movies', where: '(title LIKE ? OR alternate_titles LIKE ?) AND is_deleted = ?', whereArgs: [likeKeyword, likeKeyword, 0], orderBy: 'created_at DESC', ); return maps.map((m) => Movie.fromJson(m)).toList(); }); // 添加影视记录 Future insertMovie(Movie movie) => _wrap('insertMovie', () async { final db = await _dbHelper.database; return await db.insert('movies', movie.toJson()); }); // 更新影视记录 Future updateMovie(Movie movie) => _wrap('updateMovie', () async { final db = await _dbHelper.database; return await db.update( 'movies', movie.toJson(), where: 'id = ?', whereArgs: [movie.id], ); }); // 仅更新封面偏移量(不触发全量刷新) Future updateCoverOffset(String movieId, double offset) => _wrap('updateCoverOffset', () async { final db = await _dbHelper.database; await db.update('movies', {'cover_offset': offset}, where: 'id = ?', whereArgs: [movieId]); }); // 删除影视记录(软删除) Future deleteMovie(String id) => _wrap('deleteMovie', () async { final db = await _dbHelper.database; return await db.update( 'movies', {'is_deleted': 1, 'updated_at': DateTime.now().toIso8601String()}, where: 'id = ?', whereArgs: [id], ); }); // 获取所有导演(去重) Future> getAllDirectors() => _wrap('getAllDirectors', () async { final movies = await getAllMovies(); final directors = {}; for (final movie in movies) { directors.addAll(movie.directors); } return directors.toList()..sort(); }); // 获取所有编剧(去重) Future> getAllWriters() => _wrap('getAllWriters', () async { final movies = await getAllMovies(); final writers = {}; for (final movie in movies) { writers.addAll(movie.writers); } return writers.toList()..sort(); }); // 获取所有演员(去重) Future> getAllActors() => _wrap('getAllActors', () async { final movies = await getAllMovies(); final actors = {}; for (final movie in movies) { actors.addAll(movie.actors); } return actors.toList()..sort(); }); // 获取所有类型(去重) Future> getAllGenres() => _wrap('getAllGenres', () async { final movies = await getAllMovies(); final genres = {}; for (final movie in movies) { genres.addAll(movie.genres); } return genres.toList()..sort(); }); // 一次性获取所有元数据(导演、编剧、演员、类型) Future>> getAllMetadata() => _wrap('getAllMetadata', () async { final movies = await getAllMovies(); final directors = {}; final writers = {}; final actors = {}; final genres = {}; for (final movie in movies) { directors.addAll(movie.directors); writers.addAll(movie.writers); actors.addAll(movie.actors); genres.addAll(movie.genres); } return { 'directors': directors.toList()..sort(), 'writers': writers.toList()..sort(), 'actors': actors.toList()..sort(), 'genres': genres.toList()..sort(), }; }); // ========== 回收站相关方法 ========== // 获取已删除的影视 Future> getDeletedMovies() => _wrap('getDeletedMovies', () async { final db = await _dbHelper.database; final List> maps = await db.query( 'movies', where: 'is_deleted = ?', whereArgs: [1], orderBy: 'created_at DESC', ); return List.generate(maps.length, (i) => Movie.fromJson(maps[i])); }); // 恢复已删除的影视 Future restoreMovie(String id) => _wrap('restoreMovie', () async { final db = await _dbHelper.database; return await db.update( 'movies', {'is_deleted': 0, 'updated_at': DateTime.now().toIso8601String()}, where: 'id = ?', whereArgs: [id], ); }); // 彻底删除影视 Future permanentDeleteMovie(String id) => _wrap('permanentDeleteMovie', () async { final db = await _dbHelper.database; return await db.delete( 'movies', where: 'id = ?', whereArgs: [id], ); }); }