using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using System;
using System.Windows.Input;

namespace Ryujinx.Ava.Ui.Controls
{
    public class HotKeyControl : ContentControl, ICommandSource
    {
        public static readonly StyledProperty<object> CommandParameterProperty =
            AvaloniaProperty.Register<HotKeyControl, object>(nameof(CommandParameter));

        public static readonly DirectProperty<HotKeyControl, ICommand> CommandProperty =
            AvaloniaProperty.RegisterDirect<HotKeyControl, ICommand>(nameof(Command),
                control => control.Command, (control, command) => control.Command = command, enableDataValidation: true);

        public static readonly StyledProperty<KeyGesture> HotKeyProperty = HotKeyManager.HotKeyProperty.AddOwner<Button>();

        private ICommand _command;
        private bool _commandCanExecute;

        public ICommand Command
        {
            get { return _command; }
            set { SetAndRaise(CommandProperty, ref _command, value); }
        }

        public KeyGesture HotKey
        {
            get { return GetValue(HotKeyProperty); }
            set { SetValue(HotKeyProperty, value); }
        }

        public object CommandParameter
        {
            get { return GetValue(CommandParameterProperty); }
            set { SetValue(CommandParameterProperty, value); }
        }

        public void CanExecuteChanged(object sender, EventArgs e)
        {
            var canExecute = Command == null || Command.CanExecute(CommandParameter);

            if (canExecute != _commandCanExecute)
            {
                _commandCanExecute = canExecute;
                UpdateIsEffectivelyEnabled();
            }
        }
    }
}