using System.ComponentModel;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Media;
using Avalonia.VisualTree;
using ZB.MOM.WW.OtOpcUa.Client.UI.ViewModels;

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

public partial class AlarmsView : UserControl
{
    // Severity color bands (OPC UA severity 0-1000)
    private static readonly IBrush InactiveBrush = new SolidColorBrush(Color.Parse("#F0F0F0"));     // light grey
    private static readonly IBrush LowBrush = new SolidColorBrush(Color.Parse("#DBEAFE"));          // light blue (1-332)
    private static readonly IBrush MediumBrush = new SolidColorBrush(Color.Parse("#FEF3C7"));       // light yellow (333-665)
    private static readonly IBrush HighBrush = new SolidColorBrush(Color.Parse("#FEE2E2"));         // light red (666-899)
    private static readonly IBrush CriticalBrush = new SolidColorBrush(Color.Parse("#FECACA"));     // red (900-1000)

    /// <summary>Initializes a new instance of the <see cref="AlarmsView"/> class.</summary>
    public AlarmsView()
    {
        InitializeComponent();
    }

    /// <inheritdoc />
    protected override void OnLoaded(RoutedEventArgs e)
    {
        base.OnLoaded(e);

        var grid = this.FindControl<DataGrid>("AlarmsGrid");
        if (grid == null) return;

        var contextMenu = new ContextMenu();

        var ackItem = new MenuItem { Header = "Acknowledge..." };
        ackItem.Click += OnAcknowledgeClicked;
        contextMenu.Items.Add(ackItem);

        var shelveItem = new MenuItem { Header = "Shelve..." };
        shelveItem.Click += OnShelveClicked;
        contextMenu.Items.Add(shelveItem);

        var confirmItem = new MenuItem { Header = "Confirm..." };
        confirmItem.Click += OnConfirmClicked;
        contextMenu.Items.Add(confirmItem);

        contextMenu.Opening += OnContextMenuOpening;
        grid.ContextMenu = contextMenu;
    }

    private void OnDataGridLoadingRow(object? sender, DataGridRowEventArgs e)
    {
        if (e.Row.DataContext is AlarmEventViewModel alarm)
            e.Row.Background = GetSeverityBrush(alarm);
    }

    private static IBrush GetSeverityBrush(AlarmEventViewModel alarm)
    {
        if (!alarm.ActiveState)
            return InactiveBrush;

        return alarm.Severity switch
        {
            >= 900 => CriticalBrush,
            >= 666 => HighBrush,
            >= 333 => MediumBrush,
            _ => LowBrush
        };
    }

    private void OnContextMenuOpening(object? sender, CancelEventArgs e)
    {
        var grid = this.FindControl<DataGrid>("AlarmsGrid");
        if (grid?.SelectedItem is not AlarmEventViewModel alarm)
        {
            e.Cancel = true;
            return;
        }

        if (grid.ContextMenu is { } menu)
        {
            foreach (var item in menu.Items.OfType<MenuItem>())
            {
                item.IsEnabled = item.Header switch
                {
                    "Acknowledge..." => alarm.CanAcknowledge,
                    "Shelve..." => alarm.CanShelve,
                    "Confirm..." => alarm.CanConfirm,
                    _ => true
                };
            }
        }

        if (!alarm.CanAcknowledge && !alarm.CanShelve && !alarm.CanConfirm)
            e.Cancel = true;
    }

    private void OnAcknowledgeClicked(object? sender, RoutedEventArgs e)
    {
        if (DataContext is not AlarmsViewModel vm) return;

        var grid = this.FindControl<DataGrid>("AlarmsGrid");
        if (grid?.SelectedItem is not AlarmEventViewModel alarm || !alarm.CanAcknowledge) return;

        var parentWindow = this.FindAncestorOfType<Window>();
        if (parentWindow == null) return;

        var ackWindow = new AckAlarmWindow(vm, alarm);
        ackWindow.ShowDialog(parentWindow);
    }

    private void OnShelveClicked(object? sender, RoutedEventArgs e)
    {
        if (DataContext is not AlarmsViewModel vm) return;
        var grid = this.FindControl<DataGrid>("AlarmsGrid");
        if (grid?.SelectedItem is not AlarmEventViewModel alarm || !alarm.CanShelve) return;
        var parentWindow = this.FindAncestorOfType<Window>();
        if (parentWindow == null) return;
        new ShelveAlarmWindow(vm, alarm).ShowDialog(parentWindow);
    }

    private void OnConfirmClicked(object? sender, RoutedEventArgs e)
    {
        if (DataContext is not AlarmsViewModel vm) return;
        var grid = this.FindControl<DataGrid>("AlarmsGrid");
        if (grid?.SelectedItem is not AlarmEventViewModel alarm || !alarm.CanConfirm) return;
        var parentWindow = this.FindAncestorOfType<Window>();
        if (parentWindow == null) return;
        new ConfirmAlarmWindow(vm, alarm).ShowDialog(parentWindow);
    }
}
