import 'dart:io'; import 'package:hmg_qline/constants/app_constants.dart'; import 'package:hmg_qline/utilities/enums.dart'; import 'package:intl/intl.dart'; import 'package:logger/logger.dart'; import 'package:path_provider/path_provider.dart'; abstract class LoggerService { Future logToFile(String message, {LogTypeEnum type = LogTypeEnum.data}); Future clearLogs(); void logError(String message); void logInfo(String message); } class LoggerServiceImp implements LoggerService { Logger logger; LoggerServiceImp({required this.logger}); @override Future logToFile(String message, {LogTypeEnum type = LogTypeEnum.data}) async { try { final timestamp = DateFormat('yyyy-MM-dd hh:mm:ss a').format(DateTime.now()); final formattedMessage = "[$timestamp] ${type.name.toUpperCase()}: $message"; final dir = await getApplicationDocumentsDirectory(); final logDir = Directory('${dir.path}/logs'); if (!await logDir.exists()) { await logDir.create(recursive: true); } final logFileName = type == LogTypeEnum.error ? AppStrings.errorLogsFileName : AppStrings.dataLogsFileName; final file = File('${logDir.path}/$logFileName'); await file.writeAsString("$formattedMessage\n", mode: FileMode.append); } catch (e) { logger.i('Logging failed: $e'); } } @override Future clearLogs() async { try { final dir = await getApplicationDocumentsDirectory(); final logDir = Directory('${dir.path}/logs'); final filesToClear = [ File('${logDir.path}/${AppStrings.errorLogsFileName}'), File('${logDir.path}/${AppStrings.dataLogsFileName}'), ]; for (var file in filesToClear) { if (await file.exists()) { await file.writeAsString(''); } } } catch (e) { logger.e("Failed to clear logs: ${e.toString()}"); } } @override void logError(String message) { logger.e(message); } @override void logInfo(String message) { logger.i(message); } }