import 'dart:convert';

import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/database/tables/notification_table.dart';
import 'package:comwell_key_app/domain/models/notification_permission.dart';
import 'package:comwell_key_app/utils/json.dart';
import 'package:drift/drift.dart';

part '../../.generated/database/daos/notifications_dao.g.dart';

@DriftAccessor(tables: [NotificationPermissionEntity])
class NotificationPermissionDAO extends DatabaseAccessor<ComwellDatabase>
    with _$NotificationPermissionDAOMixin {
  NotificationPermissionDAO(super.attachedDatabase);

  Future<void> saveNotificationPermission(Iterable<NotificationPermission> permissions) async {
    final permissionsList = permissions.toList();
    await insert(permissionsList);
  }

  Future<void> insert(Iterable<NotificationPermission> permissions) async {
    final entities = permissions.map((permission) {
      final json = jsonEncode(permission.toJson());
      return NotificationPermissionEntityCompanion.insert(code: permission.code, json: json);
    });
    await batch(
      (batch) =>
          batch.insertAll(notificationPermissionEntity, entities, mode: InsertMode.insertOrReplace),
    );
  }

  Future<List<NotificationPermission>> getNotificationPermissions() async {
    final permissions = await select(notificationPermissionEntity).get();
    return permissions
        .map((permission) => NotificationPermission.fromJson(jsonDecode(permission.json) as Json))
        .toList();
  }
}