import 'dart:convert';

import 'package:comwell_key_app/database/comwell_db.dart';
import 'package:comwell_key_app/database/tables/upsale_table.dart';
import 'package:comwell_key_app/up_sales/mappers/up_sales_mapper.dart';
import 'package:comwell_key_app/up_sales/models/dto/up_sales_dto.dart';
import 'package:comwell_key_app/up_sales/models/up_sales.dart';
import 'package:comwell_key_app/utils/json.dart';
import 'package:drift/drift.dart';

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

@DriftAccessor(tables: [UpsaleEntity])
class UpsalesDAO extends DatabaseAccessor<ComwellDatabase>
    with _$UpsalesDAOMixin {
  UpsalesDAO(super.attachedDatabase);

  /// Get upsales by confirmation number
  Future<UpSales> getUpsaleByConfirmationNumber(
      String confirmationNumber) async {
    final query = select(upsaleEntity)
      ..where((tbl) => tbl.id.equals(confirmationNumber));
    final result = await query.getSingle();
    final json = jsonDecode(result.json) as Json;
    return UpSalesDTO.fromJson(json).toUpSales();
  }

  Future<void> insertUpsale(UpSalesDTO upsale) async {
    final entity = UpsaleEntityCompanion.insert(
      id: upsale.confirmationNumber,
      json: jsonEncode(upsale.toJson()),
    );
    await batch((batch) =>
        batch.insert(upsaleEntity, entity, mode: InsertMode.insertOrReplace));
  }
}