using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Media;
using ZB.MOM.WW.OtOpcUa.Client.UI.ViewModels;

namespace ZB.MOM.WW.OtOpcUa.Client.UI.Views;

public partial class WriteValueWindow : Window
{
    private readonly SubscriptionsViewModel _subscriptionsVm;
    private readonly string _nodeId;

    /// <summary>Initializes a default instance of the WriteValueWindow for XAML designer support.</summary>
    public WriteValueWindow()
    {
        InitializeComponent();
        _subscriptionsVm = null!;
        _nodeId = string.Empty;
    }

    /// <summary>Initializes a WriteValueWindow with the node to write and its current value.</summary>
    /// <param name="subscriptionsVm">The subscriptions view model for write operations.</param>
    /// <param name="nodeId">The OPC UA node ID to write to.</param>
    /// <param name="currentValue">The current value of the node, or null if unknown.</param>
    public WriteValueWindow(SubscriptionsViewModel subscriptionsVm, string nodeId, string? currentValue)
    {
        InitializeComponent();
        _subscriptionsVm = subscriptionsVm;
        _nodeId = nodeId;

        var nodeIdText = this.FindControl<TextBlock>("NodeIdText");
        if (nodeIdText != null) nodeIdText.Text = nodeId;

        var currentValueText = this.FindControl<TextBlock>("CurrentValueText");
        if (currentValueText != null) currentValueText.Text = currentValue ?? "(null)";

        // Pre-fill the write input with the current value
        var writeInput = this.FindControl<TextBox>("WriteValueInput");
        if (writeInput != null) writeInput.Text = currentValue ?? "";

        var writeButton = this.FindControl<Button>("WriteButton");
        if (writeButton != null) writeButton.Click += OnWriteClicked;

        var closeButton = this.FindControl<Button>("CloseButton");
        if (closeButton != null) closeButton.Click += OnCloseClicked;
    }

    private async void OnWriteClicked(object? sender, RoutedEventArgs e)
    {
        var input = this.FindControl<TextBox>("WriteValueInput");
        var resultText = this.FindControl<TextBlock>("ResultText");
        if (input == null || resultText == null) return;

        var rawValue = input.Text;
        if (string.IsNullOrEmpty(rawValue))
        {
            resultText.Foreground = Brushes.Red;
            resultText.Text = "Please enter a value.";
            return;
        }

        resultText.Foreground = Brushes.Gray;
        resultText.Text = "Writing...";

        var (success, message) = await _subscriptionsVm.ValidateAndWriteAsync(_nodeId, rawValue);

        if (success)
        {
            Close();
        }
        else
        {
            resultText.Foreground = Brushes.Red;
            resultText.Text = message;
        }
    }

    private void OnCloseClicked(object? sender, RoutedEventArgs e)
    {
        Close();
    }
}
