import 'dart:io'; import 'package:hmg_qline/config/dependency_injection.dart'; import 'package:hmg_qline/constants/app_constants.dart'; import 'package:hmg_qline/services/cache_service.dart'; import 'package:hmg_qline/utilities/enums.dart'; import 'package:hmg_qline/view_models/screen_config_view_model.dart'; import 'package:intl/intl.dart'; import 'package:logger/logger.dart'; import 'package:path_provider/path_provider.dart'; abstract class LoggerService { Future logToFile({required String message, required LogTypeEnum type, required String source}); Future clearLogs(); void logError(String message); void logInfo(String message); } class LoggerServiceImp implements LoggerService { Logger logger; LoggerServiceImp({required this.logger}); @override Future logToFile({required String message, required LogTypeEnum type, required String source}) async { try { final timestamp = DateFormat('yyyy-MM-dd hh:mm:ss a').format(DateTime.now()); final formattedMessage = "[$timestamp] [SOURCE: $source] ${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'); ScreenConfigViewModel screenConfigViewModel = getIt.get(); CacheService cacheService = getIt.get(); final lastLogsClearedAt = screenConfigViewModel.lastTimeLogsCleared; final now = DateTime.now(); if (lastLogsClearedAt != null && now.difference(lastLogsClearedAt).inHours >= AppConstants.clearLogsHoursThreshold) { await file.writeAsString(''); getIt.get().lastTimeLogsCleared = now; cacheService.setLastTimeLogsCleared(lastTimeCleared: now.millisecondsSinceEpoch); } await file.writeAsString("$formattedMessage\n", mode: FileMode.append); } catch (e) { logger.e('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); } }