using System; using System.Linq; using System.Windows; using System.Windows.Controls; using AutoBidder.Models; using AutoBidder.Services; using AutoBidder.ViewModels; using AutoBidder.Utilities; namespace AutoBidder { /// /// AutoBidder v4.0 - HTTP Only Multi-Auction Monitor /// Architettura modulare con partial classes e UserControls /// public partial class MainWindow : Window { // SERVIZI CORE private readonly AuctionMonitor _auctionMonitor; private readonly System.Collections.ObjectModel.ObservableCollection _auctionViewModels = new System.Collections.ObjectModel.ObservableCollection(); // UI State private AuctionViewModel? _selectedAuction; private bool _isAutomationActive = false; private bool _isUpdatingSelection = false; // Previene loop di salvataggio // Commands (initialized in MainWindow.Commands.cs) public RelayCommand? StartAllCommand { get; private set; } public RelayCommand? StopAllCommand { get; private set; } public RelayCommand? PauseAllCommand { get; private set; } public RelayCommand? GridStartCommand { get; private set; } public RelayCommand? GridPauseCommand { get; private set; } public RelayCommand? GridStopCommand { get; private set; } public RelayCommand? GridBidCommand { get; private set; } // Properties to access UserControl elements - AuctionMonitor public DataGrid MultiAuctionsGrid => AuctionMonitor.MultiAuctionsGrid; public RichTextBox LogBox => AuctionMonitor.LogBox; public Button StartButton => AuctionMonitor.StartButton; public Button PauseAllButton => AuctionMonitor.PauseAllButton; public Button StopButton => AuctionMonitor.StopButton; public Button AddUrlButton => AuctionMonitor.AddUrlButton; public Button RemoveUrlButton => AuctionMonitor.RemoveUrlButton; public TextBlock SelectedAuctionName => AuctionMonitor.SelectedAuctionName; public TextBox SelectedAuctionUrl => AuctionMonitor.SelectedAuctionUrl; public Button CopyAuctionUrlButton => AuctionMonitor.CopyAuctionUrlButton; public TextBlock SelectedAuctionBiddersCount => AuctionMonitor.SelectedAuctionBiddersCount; public DataGrid SelectedAuctionBiddersGrid => AuctionMonitor.SelectedAuctionBiddersGrid; public Button ClearBiddersButton => AuctionMonitor.ClearBiddersButton; public TextBlock MonitorateTitle => AuctionMonitor.MonitorateTitle; public TextBox SelectedBidBeforeDeadlineMs => AuctionMonitor.SelectedBidBeforeDeadlineMs; public CheckBox SelectedCheckAuctionOpen => AuctionMonitor.SelectedCheckAuctionOpen; public TextBox SelectedMinPrice => AuctionMonitor.SelectedMinPrice; public TextBox SelectedMaxPrice => AuctionMonitor.SelectedMaxPrice; public TextBox SelectedMaxClicks => AuctionMonitor.SelectedMaxClicks; public Button ResetSettingsButton => AuctionMonitor.ResetSettingsButton; public Button ClearGlobalLogButton => AuctionMonitor.ClearGlobalLogButton; public Button ClearLogButton => AuctionMonitor.ClearLogButton; public RichTextBox SelectedAuctionLog => AuctionMonitor.SelectedAuctionLog; public TextBlock RemainingBidsText => AuctionMonitor.RemainingBidsText; public TextBlock BannerAsteDaRiscattare => AuctionMonitor.BannerAsteDaRiscattare; // Properties to access UserControl elements - Browser public Microsoft.Web.WebView2.Wpf.WebView2 EmbeddedWebView => Browser.EmbeddedWebView; public TextBox BrowserAddress => Browser.BrowserAddress; // Properties to access UserControl elements - Settings public TextBox SettingsCookieTextBox => Settings.SettingsCookieTextBox; public TextBox ExportPathTextBox => Settings.ExportPathTextBox; public Button ExportBrowseButton => Settings.ExportBrowseButton; public RadioButton ExtCsv => Settings.ExtCsv; public RadioButton ExtJson => Settings.ExtJson; public RadioButton ExtXml => Settings.ExtXml; public CheckBox IncludeUsedBids => Settings.IncludeUsedBids; public CheckBox IncludeLogs => Settings.IncludeLogs; public CheckBox IncludeUserBids => Settings.IncludeUserBids; public CheckBox IncludeMetadata => Settings.IncludeMetadata; public CheckBox RemoveAfterExport => Settings.RemoveAfterExport; public CheckBox OverwriteExisting => Settings.OverwriteExisting; // Impostazioni predefinite aste - AGGIORNATO public TextBox DefaultBidBeforeDeadlineMs => Settings.DefaultBidBeforeDeadlineMsTextBox; public CheckBox DefaultCheckAuctionOpen => Settings.DefaultCheckAuctionOpenCheckBox; public TextBox DefaultMinPrice => Settings.DefaultMinPriceTextBox; public TextBox DefaultMaxPrice => Settings.DefaultMaxPriceTextBox; public TextBox DefaultMaxClicks => Settings.DefaultMaxClicksTextBox; public MainWindow() { InitializeComponent(); // Inizializza servizi _auctionMonitor = new AuctionMonitor(); // Initialize commands (from MainWindow.Commands.cs) InitializeCommands(); this.DataContext = this; // Event handlers for auction monitor _auctionMonitor.OnAuctionUpdated += AuctionMonitor_OnAuctionUpdated; _auctionMonitor.OnBidExecuted += AuctionMonitor_OnBidExecuted; _auctionMonitor.OnLog += AuctionMonitor_OnLog; _auctionMonitor.OnResetCountChanged += AuctionMonitor_OnResetCountChanged; // Bind griglia MultiAuctionsGrid.ItemsSource = _auctionViewModels; // Carica aste salvate (from MainWindow.AuctionManagement.cs) LoadSavedAuctions(); // Load export settings (from MainWindow.EventHandlers.Export.cs) LoadExportSettings(); // CARICA IMPOSTAZIONI PREDEFINITE ASTE LoadDefaultSettings(); // Update initial button states UpdateGlobalControlButtons(); Log("[OK] AutoBidder v4.0 avviato (API-based)", LogLevel.Success); Log("[INFO] Usa 'Configura Sessione' per inserire cookie dal menu Applicazioni di Chrome", LogLevel.Info); // Initialize user info timers (from MainWindow.UserInfo.cs) InitializeUserInfoTimers(); _ = UpdateUserBannerInfoAsync(); _ = UpdateUserHtmlInfoAsync(); // Attach WebView2 context menu handler try { if (EmbeddedWebView != null) { EmbeddedWebView.CoreWebView2InitializationCompleted += (s, e) => { try { if (e.IsSuccess && EmbeddedWebView?.CoreWebView2 != null) { EmbeddedWebView.CoreWebView2.ContextMenuRequested += CoreWebView2_ContextMenuRequested; } } catch { } }; } } catch { } } // ===== AUCTION MONITOR EVENT HANDLERS ===== private void AuctionMonitor_OnAuctionUpdated(AuctionState state) { Dispatcher.BeginInvoke(() => { var vm = _auctionViewModels.FirstOrDefault(a => a.AuctionId == state.AuctionId); vm?.UpdateState(state); if (_selectedAuction != null && _selectedAuction.AuctionId == state.AuctionId) { UpdateAuctionLog(_selectedAuction); RefreshBiddersGrid(_selectedAuction); } UpdateGlobalControlButtons(); }); } private void AuctionMonitor_OnBidExecuted(AuctionInfo auction, BidResult result) { Dispatcher.BeginInvoke(() => { var vm = _auctionViewModels.FirstOrDefault(a => a.AuctionId == auction.AuctionId); if (vm != null) { vm.RefreshCounters(); if (result.Success) { Log($"[OK] Click su {auction.Name}: {result.LatencyMs}ms {result.Response}", LogLevel.Success); } else { Log($"[FAIL] Click fallito su {auction.Name}: {result.Error}", LogLevel.Error); } } }); } private void AuctionMonitor_OnLog(string message) { Log(message); } private void AuctionMonitor_OnResetCountChanged(string auctionId) { Dispatcher.BeginInvoke(() => { var vm = _auctionViewModels.FirstOrDefault(a => a.AuctionId == auctionId); vm?.RefreshCounters(); }); } } }