import 'dart:developer'; import 'package:enaklo_pos/core/database/database_handler.dart'; import 'package:enaklo_pos/data/models/response/print_model.dart'; import 'package:sqflite/sqflite.dart'; class PrinterLocalDatasource { static PrinterLocalDatasource? _instance; PrinterLocalDatasource._internal(); static PrinterLocalDatasource get instance { _instance ??= PrinterLocalDatasource._internal(); return _instance!; } Future get _db async => await DatabaseHelper.instance.database; // Create new printer Future createPrinter(PrintModel printer) async { final db = await _db; try { log('Creating printer: ${printer.toString()}'); final id = await db.insert( 'printers', printer.toMapForInsert(), conflictAlgorithm: ConflictAlgorithm.abort, // Fail if code already exists ); log('Successfully created printer with ID: $id'); return id; } catch (e) { log('Error creating printer: $e'); rethrow; } } // Update existing printer Future updatePrinter(PrintModel printer, int id) async { final db = await _db; try { log('Updating printer ID $id: ${printer.toString()}'); final updatedRows = await db.update( 'printers', printer.toMapForUpdate(), where: 'id = ?', whereArgs: [id], ); if (updatedRows == 0) { throw Exception('Printer with ID $id not found'); } log('Successfully updated printer ID: $id'); } catch (e) { log('Error updating printer: $e'); rethrow; } } // Delete printer by ID Future deletePrinter(int id) async { final db = await _db; try { log('Deleting printer ID: $id'); final deletedRows = await db.delete( 'printers', where: 'id = ?', whereArgs: [id], ); if (deletedRows == 0) { throw Exception('Printer with ID $id not found'); } log('Successfully deleted printer ID: $id'); } catch (e) { log('Error deleting printer: $e'); rethrow; } } // Get printer by code Future getPrinterByCode(String code) async { final db = await _db; try { log('Getting printer by code: $code'); final result = await db.query( 'printers', where: 'code = ?', whereArgs: [code], ); if (result.isEmpty) { log('Printer with code $code not found'); return null; } final printer = PrintModel.fromMap(result.first); log('Found printer: ${printer.toString()}'); return printer; } catch (e) { log('Error getting printer by code: $e'); return null; } } // Get printer by ID Future getPrinterById(int id) async { final db = await _db; try { log('Getting printer by ID: $id'); final result = await db.query( 'printers', where: 'id = ?', whereArgs: [id], ); if (result.isEmpty) { log('Printer with ID $id not found'); return null; } final printer = PrintModel.fromMap(result.first); log('Found printer: ${printer.toString()}'); return printer; } catch (e) { log('Error getting printer by ID: $e'); return null; } } // Get all printers Future> getAllPrinters() async { final db = await _db; try { log('Getting all printers'); final result = await db.query( 'printers', orderBy: 'name ASC', ); final printers = result.map((map) => PrintModel.fromMap(map)).toList(); log('Found ${printers.length} printers'); return printers; } catch (e) { log('Error getting all printers: $e'); return []; } } // Get printers by type Future> getPrintersByType(String type) async { final db = await _db; try { log('Getting printers by type: $type'); final result = await db.query( 'printers', where: 'type = ?', whereArgs: [type], orderBy: 'name ASC', ); final printers = result.map((map) => PrintModel.fromMap(map)).toList(); log('Found ${printers.length} printers with type $type'); return printers; } catch (e) { log('Error getting printers by type: $e'); return []; } } // Search printers by name Future> searchPrintersByName(String query) async { final db = await _db; try { log('Searching printers by name: $query'); final result = await db.query( 'printers', where: 'name LIKE ?', whereArgs: ['%$query%'], orderBy: 'name ASC', ); final printers = result.map((map) => PrintModel.fromMap(map)).toList(); log('Found ${printers.length} printers matching "$query"'); return printers; } catch (e) { log('Error searching printers: $e'); return []; } } // Check if printer code exists Future isPrinterCodeExists(String code, {int? excludeId}) async { final db = await _db; try { String whereClause = 'code = ?'; List whereArgs = [code]; if (excludeId != null) { whereClause += ' AND id != ?'; whereArgs.add(excludeId); } final result = await db.query( 'printers', where: whereClause, whereArgs: whereArgs, ); final exists = result.isNotEmpty; log('Printer code "$code" exists: $exists'); return exists; } catch (e) { log('Error checking printer code existence: $e'); return false; } } // Get printer statistics Future> getPrinterStats() async { final db = await _db; try { // Total count final totalResult = await db.rawQuery('SELECT COUNT(*) as total FROM printers'); final totalCount = totalResult.first['total'] as int; // Count by type final typeResult = await db.rawQuery(''' SELECT type, COUNT(*) as count FROM printers WHERE type IS NOT NULL GROUP BY type '''); final typeStats = {}; for (final row in typeResult) { typeStats[row['type'] as String] = row['count'] as int; } final stats = { 'total_printers': totalCount, 'by_type': typeStats, }; log('Printer stats: $stats'); return stats; } catch (e) { log('Error getting printer stats: $e'); return { 'total_printers': 0, 'by_type': {}, }; } } // Clear all printers (for testing/reset purposes) Future clearAllPrinters() async { final db = await _db; try { log('Clearing all printers'); await db.delete('printers'); log('All printers cleared'); } catch (e) { log('Error clearing printers: $e'); rethrow; } } // Batch insert printers Future insertPrinters(List printers) async { final db = await _db; try { log('Batch inserting ${printers.length} printers'); await db.transaction((txn) async { for (final printer in printers) { await txn.insert( 'printers', printer.toMapForInsert(), conflictAlgorithm: ConflictAlgorithm.replace, ); } }); log('Successfully batch inserted ${printers.length} printers'); } catch (e) { log('Error batch inserting printers: $e'); rethrow; } } }