76 lines
3.4 KiB
Dart
76 lines
3.4 KiB
Dart
|
|
import 'package:budget_app/models/transaction_record.dart';
|
|
import 'package:budget_app/services/ai_transaction_processing_service.dart';
|
|
import 'package:get_it/get_it.dart';
|
|
import 'package:logger/logger.dart';
|
|
|
|
/// Псевдоним для типа функции обработки СМС
|
|
typedef SmsProcessingFunction = Future<TransactionRecord?> Function(String smsBody);
|
|
|
|
/// Класс для управления кастомными функциями обработки СМС
|
|
class CustomSmsFunctions {
|
|
// Приватный конструктор, чтобы нельзя было создать экземпляр класса
|
|
CustomSmsFunctions._();
|
|
|
|
/// Карта доступных кастомных функций.
|
|
/// Ключ - это уникальный идентификатор функции, который будет храниться в настройках.
|
|
/// Значение - это сама функция.
|
|
static final Map<String, SmsProcessingFunction> _availableFunctions = {
|
|
'ai_request': _aiRequestHandler,
|
|
};
|
|
|
|
/// Карта с названиями функций для отображения в UI.
|
|
/// Ключ - идентификатор функции, значение - человекочитаемое имя.
|
|
static final Map<String, String> functionNames = {
|
|
'ai_request': 'Запрос к ИИ',
|
|
};
|
|
|
|
/// Возвращает список идентификаторов доступных функций.
|
|
static List<String> get availableFunctionIds => _availableFunctions.keys.toList();
|
|
|
|
/// Возвращает функцию по ее идентификатору.
|
|
static SmsProcessingFunction? getFunctionById(String id) {
|
|
return _availableFunctions[id];
|
|
}
|
|
|
|
// --- Реализации кастомных функций ---
|
|
|
|
/// Обработчик для функции "Запрос к ИИ".
|
|
/// Анализирует текст СМС с помощью ИИ и создает транзакцию.
|
|
static Future<TransactionRecord?> _aiRequestHandler(String smsBody) async {
|
|
final logger = Logger();
|
|
|
|
try {
|
|
logger.i('--- AI Request Handler ---');
|
|
logger.i('SMS Body: $smsBody');
|
|
|
|
// Получаем сервис обработки ИИ транзакций
|
|
final aiProcessingService = GetIt.instance<AiTransactionProcessingService>();
|
|
|
|
// Создаем уникальный ID для SMS (в реальности будет передаваться извне)
|
|
final smsMessageId = DateTime.now().millisecondsSinceEpoch.toString();
|
|
|
|
// Обрабатываем SMS с помощью ИИ
|
|
final prefilledTransaction = await aiProcessingService.processSmsByAi(
|
|
smsBody,
|
|
smsMessageId
|
|
);
|
|
|
|
logger.i('ИИ создал PrefilledTransaction: ${prefilledTransaction.salesPoint}, ${prefilledTransaction.amount}');
|
|
|
|
// Конвертируем PrefilledTransaction в TransactionRecord
|
|
final transactionRecord = await aiProcessingService.convertToTransactionRecord(
|
|
prefilledTransaction
|
|
);
|
|
|
|
logger.i('Создана транзакция: ${transactionRecord.vendor}, ${transactionRecord.amount}');
|
|
logger.i('--- End AI Request Handler ---');
|
|
|
|
return transactionRecord;
|
|
} catch (e) {
|
|
logger.e('Ошибка в AI Request Handler: $e');
|
|
return null;
|
|
}
|
|
}
|
|
}
|