// Package imports:
import 'package:drift/drift.dart';
import 'package:remever/common/functions.dart';
import 'package:remever/database/database.dart';
import 'package:remever/database/tables.dart';
import 'package:remever/models/collection_dto.dart';

part 'collections_dao.g.dart';

@DriftAccessor(tables: <Type>[Collections])
class CollectionsDao extends DatabaseAccessor<AppDatabase>
    with _$CollectionsDaoMixin {
  ///
  /// Репозиторий для работы с коллекциями
  ///
  CollectionsDao(super.attachedDatabase);

  /// Получение коллекций из базы данных
  Stream<List<Collection>> getCollections() {
    try {
      return db.managers.collections.watch();
    } catch (e, st) {
      logger.logError('Ошибка в методе getCollections', e, st);

      throw ('EXEPTION');
    }
  }

  /// Создание коллекции
  Future<void> createCollection(CollectionDto dto) async {
    try {
      await db.managers.collections.create(
        (o) => o(
          title: dto.title,
          desc: dto.desc,
          isPublic: Value<bool>(dto.isPublic),
          image: Value<Uint8List?>(dto.avatar),
        ),
      );
    } catch (e, st) {
      logger.logError('Ошибка в методе createCollection', e, st);
    }
  }

  /// Обновление коллекции
  Future<void> updateCollection(CollectionDto dto, String id) async {
    try {
      await db.managers.collections
          .filter((f) => f.id(id))
          .update(
            (o) => o(
              title: Value<String>(dto.title),
              desc: Value<String>(dto.desc),
              isPublic: Value<bool>(dto.isPublic),
              image: Value<Uint8List?>(dto.avatar),
            ),
          );
    } catch (e, st) {
      logger.logError('Ошибка в методе updateCollection', e, st);
    }
  }

  /// Удаление коллекции
  Future<void> deleteCollection(String id) async {
    try {
      await db.managers.collections.filter((f) => f.id(id)).delete();
    } catch (e, st) {
      logger.logError('Ошибка в методе deleteCollection', e, st);
    }
  }
}
