using System; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; using CRAWLER.Models; using CRAWLER.Services; using CRAWLER.ViewModels; namespace CRAWLER; public partial class MainWindow : Window { private readonly IFilePickerService _filePickerService; private readonly MainWindowViewModel _viewModel; internal MainWindow( InstrumentCatalogService catalogService, IPdfOpener pdfOpener, IFilePickerService filePickerService) { InitializeComponent(); _filePickerService = filePickerService; _viewModel = new MainWindowViewModel(catalogService, pdfOpener); DataContext = _viewModel; } private async void Window_Loaded(object sender, RoutedEventArgs e) { await ExecuteUiAsync(_viewModel.InitializeAsync); } private async void RefreshButton_Click(object sender, RoutedEventArgs e) { await ExecuteUiAsync(() => _viewModel.RefreshAsync()); } private async void SyncButton_Click(object sender, RoutedEventArgs e) { await ExecuteUiAsync(async () => { var result = await _viewModel.SyncAsync(); MessageBox.Show( $"Обработано страниц: {result.PagesScanned}\n" + $"Обработано записей: {result.ProcessedItems}\n" + $"Добавлено: {result.AddedRecords}\n" + $"Обновлено: {result.UpdatedRecords}\n" + $"Пропущено страниц: {result.FailedPages}\n" + $"Пропущено записей: {result.FailedItems}\n" + $"Карточек без деталей: {result.SkippedDetailRequests}\n" + $"Скачано PDF: {result.DownloadedPdfFiles}\n" + $"Ошибок PDF: {result.FailedPdfFiles}", "CRAWLER", MessageBoxButton.OK, MessageBoxImage.Information); }); } private async void AddButton_Click(object sender, RoutedEventArgs e) { var dialog = new Dialogs.EditInstrumentWindow( new EditInstrumentWindowViewModel(_viewModel.CreateNewDraft(), true), _filePickerService) { Owner = this }; if (dialog.ShowDialog() == true) { await ExecuteUiAsync(() => _viewModel.SaveAsync(dialog.ViewModel.Draft, dialog.ViewModel.GetPendingPaths())); } } private async void EditButton_Click(object sender, RoutedEventArgs e) { if (_viewModel.SelectedInstrument == null) { return; } var dialog = new Dialogs.EditInstrumentWindow( new EditInstrumentWindowViewModel(_viewModel.CreateDraftFromSelected(), false), _filePickerService) { Owner = this }; if (dialog.ShowDialog() == true) { await ExecuteUiAsync(() => _viewModel.SaveAsync(dialog.ViewModel.Draft, dialog.ViewModel.GetPendingPaths())); } } private async void DeleteButton_Click(object sender, RoutedEventArgs e) { if (_viewModel.SelectedInstrument == null) { return; } var answer = MessageBox.Show( $"Удалить запись \"{_viewModel.SelectedInstrument.Name}\"?", "CRAWLER", MessageBoxButton.YesNo, MessageBoxImage.Warning); if (answer == MessageBoxResult.Yes) { await ExecuteUiAsync(_viewModel.DeleteSelectedAsync); } } private async void AddPdfButton_Click(object sender, RoutedEventArgs e) { if (_viewModel.SelectedInstrument == null) { return; } var paths = _filePickerService.PickPdfFiles(true); if (paths.Count == 0) { return; } await ExecuteUiAsync(() => _viewModel.AddAttachmentsToSelectedAsync(paths)); } private void OpenAttachmentButton_Click(object sender, RoutedEventArgs e) { _viewModel.OpenAttachment(AttachmentGrid.SelectedItem as PdfAttachment); } private async void RemoveAttachmentButton_Click(object sender, RoutedEventArgs e) { var attachment = AttachmentGrid.SelectedItem as PdfAttachment; if (attachment == null) { return; } var answer = MessageBox.Show( $"Удалить привязку к PDF \"{attachment.DisplayName}\"?", "CRAWLER", MessageBoxButton.YesNo, MessageBoxImage.Warning); if (answer == MessageBoxResult.Yes) { await ExecuteUiAsync(() => _viewModel.RemoveAttachmentAsync(attachment)); } } private void OpenSourceButton_Click(object sender, RoutedEventArgs e) { _viewModel.OpenSourceUrl(); } private async void InstrumentGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) { if (_viewModel.SelectedInstrument != null) { EditButton_Click(sender, e); } await Task.CompletedTask; } private async void SearchTextBox_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { e.Handled = true; await ExecuteUiAsync(() => _viewModel.RefreshAsync()); } } private async Task ExecuteUiAsync(Func action) { try { await action(); } catch (Exception ex) { MessageBox.Show(ex.Message, "CRAWLER", MessageBoxButton.OK, MessageBoxImage.Error); } } }