using System.ComponentModel; using System.Windows; using JournalBot.Shared; namespace JournalBot.Tray; public partial class MainWindow : Window { private readonly BotRunner _runner; private readonly RuntimeReader _reader; public MainWindow(BotRunner runner, RuntimeReader reader) { _runner = runner; _reader = reader; InitializeComponent(); Refresh(); } // Hide instead of close (keep app alive in tray). protected override void OnClosing(CancelEventArgs e) { e.Cancel = true; Hide(); } public void Refresh() { var status = _reader.ReadStatus(); StatusBanner.Text = $"{status.Pending} pending ยท {status.Failed} failed"; HistoryGrid.ItemsSource = _reader.ReadHistory(); LogBox.Text = string.Join("\n", _reader.TailLog("service.log", 200)); } public async void TriggerCommand(string command) { SetButtons(false); try { var result = await _runner.RunAsync(command); LogBox.Text = result.Output + "\n" + LogBox.Text; Refresh(); } catch (Exception ex) { LogBox.Text = $"[ERROR] {ex.Message}\n" + LogBox.Text; } finally { SetButtons(true); } } private void SetButtons(bool enabled) { BtnIngest.IsEnabled = enabled; BtnProcess.IsEnabled = enabled; BtnBoth.IsEnabled = enabled; } private void BtnIngest_Click(object sender, RoutedEventArgs e) => TriggerCommand("ingest"); private void BtnProcess_Click(object sender, RoutedEventArgs e) => TriggerCommand("process"); private void BtnBoth_Click(object sender, RoutedEventArgs e) => TriggerCommand("both"); private void BtnRefresh_Click(object sender, RoutedEventArgs e) => Refresh(); }