package main import ( "log" "audio-catalyst/internal/application/usecases" "audio-catalyst/internal/domain/entities" "audio-catalyst/internal/domain/repositories" "audio-catalyst/internal/infrastructure/config" "audio-catalyst/internal/infrastructure/filesystem" "audio-catalyst/internal/infrastructure/logging" "audio-catalyst/internal/infrastructure/rutracker" "audio-catalyst/internal/presentation/tui" ) func main() { // Загрузка конфигурации configRepo := config.NewRepository() appConfig, err := configRepo.Load("config.yaml") if err != nil { log.Fatalf("Ошибка загрузки конфигурации: %v", err) } // Инициализация базового логгера (в файл) fileLogger, err := logging.NewFileLogger( appConfig.Output.LogFileName, appConfig.Output.LogLevel, appConfig.Output.LogMaxSizeMB, appConfig.Output.LogToFile, ) if err != nil { log.Printf("Предупреждение: не удалось инициализировать логгер: %v", err) } if fileLogger != nil { defer fileLogger.Close() } // Инициализация TUI tuiManager := tui.NewManager() tuiManager.Initialize() // Оборачиваем логгер адаптером, чтобы видеть логи в TUI var logger repositories.Logger logger = tui.NewUILogger(fileLogger, tuiManager) // Инициализация репозиториев fsRepo := filesystem.NewRepository() rutrackerRepo, err := rutracker.NewRepository( appConfig.RuTracker.Username, appConfig.RuTracker.Password, ) if err != nil { log.Fatalf("Ошибка создания RuTracker репозитория: %v", err) } defer rutrackerRepo.Close() // Инициализация use case processUseCase := usecases.NewProcessAudioBooksUseCase( fsRepo, rutrackerRepo, logger, ) // Подключаем репортер прогресса к TUI processUseCase.SetProgressReporter(func(s entities.ProcessingStatus) { tuiManager.SendStatusUpdate(s) }) // Создание процессора для обработки команд processor := &ApplicationProcessor{ processUseCase: processUseCase, config: appConfig, tuiManager: tuiManager, logger: logger, } // Привязываем запуск обработки к TUI tuiManager.SetOnStartProcessing(func() { processor.StartProcessing() }) // Запуск обработчика команд в горутине go processor.HandleCommands() // Запуск TUI if err := tuiManager.Run(); err != nil { log.Fatalf("Ошибка запуска TUI: %v", err) } } // ApplicationProcessor обрабатывает команды приложения type ApplicationProcessor struct { processUseCase *usecases.ProcessAudioBooksUseCase config *entities.Config tuiManager *tui.Manager logger repositories.Logger } // HandleCommands обрабатывает команды от пользователя func (p *ApplicationProcessor) HandleCommands() { // Пока оставим пустым — команды приходят через UI callbacks } // StartProcessing запускает обработку аудиокниг func (p *ApplicationProcessor) StartProcessing() { if p.logger != nil { p.logger.Info("Запуск обработки аудиокниг...") } // Запускаем обработку (репортинг прогресса выполняет use case) if err := p.processUseCase.Execute(p.config); err != nil { if p.logger != nil { p.logger.Error("Ошибка обработки: %v", err) } return } if p.logger != nil { p.logger.Success("Обработка аудиокниг завершена успешно") } }