import 'package:drift/drift.dart';
import 'package:sendtrain/database/database.dart';

part 'media_items_dao.g.dart';

@DriftAccessor(tables: [MediaItems])
class MediaItemsDao extends DatabaseAccessor<AppDatabase> with _$MediaItemsDaoMixin {
  MediaItemsDao(super.db);

  Future<List<MediaItem>> all() async {
    return await select(mediaItems).get();
  }

  Future<MediaItem> find(int id) async {
    return await (select(mediaItems)..where((mediaItem) => mediaItem.id.equals(id) )).getSingle();
  }

  Future<List<MediaItem>> fromActivity(Activity activity) async {
    final result = select(db.objectMediaItems).join(
      [
        innerJoin(
          db.mediaItems,
          db.mediaItems.id.equalsExp(db.objectMediaItems.mediaId),
        ),
      ],
    )
      ..where(
          db.objectMediaItems.objectType.equals(ObjectType.activities.name))
      ..where(db.objectMediaItems.objectId.equals(activity.id));

    final mediaItems = (await result.get())
        .map((e) => e.readTable(db.mediaItems))
        .toList();

    return mediaItems;
  }

  Future<List<MediaItem>> fromSession(Session session) async {
    final result = select(db.objectMediaItems).join(
      [
        innerJoin(
          db.mediaItems,
          db.mediaItems.id.equalsExp(db.objectMediaItems.mediaId),
        ),
      ],
    )
      ..where(
          db.objectMediaItems.objectType.equals(ObjectType.sessions.name))
      ..where(db.objectMediaItems.objectId.equals(session.id));

    final mediaItems = (await result.get())
        .map((e) => e.readTable(db.mediaItems))
        .toList();

    return mediaItems;
  }
}