// 原始文件: MainWindow.xaml.cs (WPF 代码后置 C#)
// 本文件为文本示例（平台不允许原扩展名），复制时请改回原名。

/*
 * MainWindow.xaml.cs — 工业上位机主界面代码后置 (WPF)
 *
 * 严格遵循工业级红线：
 * - 红线①：UI与业务绝对分离。此类仅包含窗口初始化和事件绑定。
 *            所有业务逻辑通过 ViewModel 或 Service 接口调用。
 * - 红线②：UI线程禁网。所有耗时操作通过 async/await 或 BackgroundWorker 执行。
 */

using System;
using System.ComponentModel;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace PowerTestController.UI
{
    /// <summary>
    /// 主窗口。
    /// 红线①：只负责 UI 初始化和事件绑定，不包含业务逻辑。
    /// </summary>
    public partial class MainWindow : Window
    {
        // 业务层服务（通过构造函数注入，遵循红线⑤面向接口编程）
        private readonly IMeasurementService _measurementService;
        private readonly ILogger _logger;

        private BackgroundWorker _measureWorker;

        public MainWindow(IMeasurementService measurementService, ILogger logger)
        {
            InitializeComponent();

            _measurementService = measurementService;
            _logger = logger;

            // 绑定事件（仅绑定，不包含业务逻辑）
            BindEvents();
        }

        /// <summary>
        /// 绑定控件事件到后台方法。
        /// 这些方法只负责触发操作，不包含业务处理代码。
        /// </summary>
        private void BindEvents()
        {
            btn_connect.Click += OnConnectClick;
            btn_disconnect.Click += OnDisconnectClick;
            btn_start_measure.Click += OnStartMeasureClick;
            btn_stop_measure.Click += OnStopMeasureClick;
            btn_emergency_stop.Click += OnEmergencyStopClick;

            btn_export_csv.Click += OnExportCsvClick;
            btn_export_excel.Click += OnExportExcelClick;
            btn_clear_table.Click += (s, e) => tbl_results.Items.Clear();
        }

        // ═══════════════════════════════════════════
        // 连接相关（红线②：async 后台执行）
        // ═══════════════════════════════════════════

        private async void OnConnectClick(object sender, RoutedEventArgs e)
        {
            var ip = txt_ip_address.Text.Trim();
            if (!int.TryParse(txt_port.Text, out var port))
            {
                MessageBox.Show("请输入有效的端口号", "输入错误");
                return;
            }

            btn_connect.IsEnabled = false;
            lbl_connection_status.Text = "● 连接中...";

            try
            {
                // 红线②：异步执行，不阻塞UI
                await Task.Run(() => _measurementService.Connect(ip, port));

                Dispatcher.Invoke(() =>
                {
                    lbl_connection_status.Text = "● 已连接";
                    btn_connect.IsEnabled = false;
                    btn_disconnect.IsEnabled = true;
                });

                Log("仪器连接成功");
            }
            catch (Exception ex)
            {
                Dispatcher.Invoke(() =>
                {
                    lbl_connection_status.Text = "● 连接失败";
                    btn_connect.IsEnabled = true;
                    MessageBox.Show(ex.Message, "连接失败");
                });

                Log($"连接失败: {ex.Message}");
            }
        }

        private void OnDisconnectClick(object sender, RoutedEventArgs e)
        {
            btn_disconnect.IsEnabled = false;
            btn_connect.IsEnabled = true;
            lbl_connection_status.Text = "● 未连接";

            _measurementService.Disconnect();
            Log("仪器已断开");
        }

        // ═══════════════════════════════════════════
        // 测量相关（红线②：BackgroundWorker 后台执行）
        // ═══════════════════════════════════════════

        private void OnStartMeasureClick(object sender, RoutedEventArgs e)
        {
            btn_start_measure.IsEnabled = false;
            btn_stop_measure.IsEnabled = true;
            prg_progress.Visibility = Visibility.Visible;

            _measureWorker = new BackgroundWorker
            {
                WorkerSupportsCancellation = true,
                WorkerReportsProgress = true,
            };

            _measureWorker.DoWork += MeasureWorker_DoWork;
            _measureWorker.ProgressChanged += MeasureWorker_ProgressChanged;
            _measureWorker.RunWorkerCompleted += MeasureWorker_Completed;

            _measureWorker.RunWorkerAsync();
        }

        private void MeasureWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            var worker = (BackgroundWorker)sender;

            while (!worker.CancellationPending)
            {
                // 调用业务层测量
                var result = _measurementService.MeasureVoltage();
                worker.ReportProgress(0, result);

                System.Threading.Thread.Sleep(1000);  // 采样间隔
            }
        }

        private void MeasureWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            var result = e.UserState as dynamic;

            Dispatcher.Invoke(() =>
            {
                // 更新实时数据显示
                if (result.Type == "voltage_dc")
                    lbl_voltage.Text = $"{result.Value:F3} V";
                else if (result.Type == "current_dc")
                    lbl_current.Text = $"{result.Value:F3} A";

                // 添加到数据表格
                tbl_results.Items.Add(new
                {
                    Time = DateTime.Now.ToString("HH:mm:ss"),
                    Type = result.Type,
                    Value = $"{result.Value:F3}",
                    Unit = result.Unit,
                    Status = result.Success ? "OK" : "ERR"
                });
            });
        }

        private void MeasureWorker_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            btn_start_measure.IsEnabled = true;
            btn_stop_measure.IsEnabled = false;
            prg_progress.Visibility = Visibility.Collapsed;
            Log("测量序列完成");
        }

        private void OnStopMeasureClick(object sender, RoutedEventArgs e)
        {
            _measureWorker?.CancelAsync();
            btn_start_measure.IsEnabled = true;
            btn_stop_measure.IsEnabled = false;
            prg_progress.Visibility = Visibility.Collapsed;
            Log("用户停止测量");
        }

        private void OnEmergencyStopClick(object sender, RoutedEventArgs e)
        {
            var result = MessageBox.Show(
                "确认紧急停止？", "确认",
                MessageBoxButton.YesNo, MessageBoxImage.Warning);

            if (result == MessageBoxResult.Yes)
            {
                _measureWorker?.CancelAsync();
                _measurementService.EmergencyStop();

                btn_start_measure.IsEnabled = true;
                btn_stop_measure.IsEnabled = false;
                prg_progress.Visibility = Visibility.Collapsed;

                Log("⚠ 紧急停止已触发");
            }
        }

        // ═══════════════════════════════════════════
        // 导出
        // ═══════════════════════════════════════════

        private void OnExportCsvClick(object sender, RoutedEventArgs e)
        {
            var dialog = new Microsoft.Win32.SaveFileDialog
            {
                Filter = "CSV Files (*.csv)|*.csv",
                FileName = "export.csv"
            };

            if (dialog.ShowDialog() == true)
            {
                _measurementService.ExportData("csv", dialog.FileName);
                Log($"数据已导出: {dialog.FileName}");
            }
        }

        private void OnExportExcelClick(object sender, RoutedEventArgs e)
        {
            var dialog = new Microsoft.Win32.SaveFileDialog
            {
                Filter = "Excel Files (*.xlsx)|*.xlsx",
                FileName = "export.xlsx"
            };

            if (dialog.ShowDialog() == true)
            {
                _measurementService.ExportData("excel", dialog.FileName);
                Log($"数据已导出: {dialog.FileName}");
            }
        }

        // ═══════════════════════════════════════════
        // 辅助方法
        // ═══════════════════════════════════════════

        private void Log(string message)
        {
            var ts = DateTime.Now.ToString("HH:mm:ss");
            lbl_status_msg.Text = $"[{ts}] {message}";
            _logger?.Info(message);
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            _measureWorker?.CancelAsync();
            _measurementService?.Cleanup();
            base.OnClosing(e);
        }
    }
}
