import 'dart:ui'; import 'package:drift/drift.dart'; import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:lensai/features/bangs/data/database/database.dart'; import 'package:lensai/features/bangs/data/models/bang.dart'; import 'package:lensai/features/bangs/data/models/bang_data.dart'; part 'bang.g.dart'; @DriftAccessor() class BangDao extends DatabaseAccessor with _$BangDaoMixin { BangDao(super.db); Selectable getBangList({Iterable? groups}) { final selectable = select(db.bang); if (groups != null) { selectable.where((t) => t.group.isInValues(groups)); } return selectable; } SingleSelectable getBangCount({Iterable? groups}) { return db.bang.count( where: (groups != null) ? (t) => t.group.isInValues(groups) : null, ); } SingleOrNullSelectable getBangData(String trigger) { return select(db.bangDataView)..where((t) => t.trigger.equals(trigger)); } Selectable getBangDataList({ Iterable? groups, String? domain, String? category, String? subCategory, bool? orderMostFrequentFirst, }) { final selectable = select(db.bangDataView); if (groups != null) { selectable.where((t) => t.group.isInValues(groups)); } if (domain != null) { selectable.where((t) => t.domain.equals(domain)); } if (category != null) { selectable.where((t) => t.category.equals(category)); if (subCategory != null) { selectable.where((t) => t.subCategory.equals(subCategory)); } } selectable.orderBy([ if (orderMostFrequentFirst == true) (t) => OrderingTerm.desc(t.frequency), (t) => OrderingTerm.asc(t.websiteName), ]); return selectable; } Selectable getFrequentBangDataList({Iterable? groups}) { final selectable = select(db.bangDataView) ..where((t) => t.frequency.isBiggerThanValue(0)); if (groups != null) { selectable.where((t) => t.group.isInValues(groups)); } selectable.orderBy([ (t) => OrderingTerm.desc(t.frequency), (t) => OrderingTerm.desc(t.lastUsed), ]); return selectable; } Future increaseBangFrequency(String trigger) { return db.bangFrequency.insertOne( BangFrequencyCompanion.insert( trigger: trigger, frequency: 1, lastUsed: DateTime.now(), ), onConflict: DoUpdate( (old) => BangFrequencyCompanion.custom( frequency: old.frequency + const Constant(1), lastUsed: Variable(DateTime.now()), ), ), ); } Selectable queryBangs(String searchString) { return db.bangQuery(query: db.buildQuery(searchString)); } // Future upsertBangIcon(String trigger, BrowserIcon icon) async { // //TODO: swithc to WEBP in future, requires 3rd party // final compressed = await icon.image.toByteData(format: ImageByteFormat.png); // return db.bangIcon.insertOne( // BangIconCompanion.insert( // trigger: trigger, // iconData: compressed!.buffer.asUint8List(), // fetchDate: DateTime.now(), // ), // mode: InsertMode.insertOrReplace, // ); // } }