using System.Runtime.InteropServices;
using Decal.Interop.Input;

namespace Decal.DecalInput
{
    [ComVisible(true)]
    [Guid("F3170E85-517E-43A4-B7B4-6F006A7B1B85")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComSourceInterfaces(typeof(IWinMsgHookEvents))]
    [ProgId("DecalInput.WinMsgHook")]
    public class WinMsgHookImpl : IWinMsgHook
    {
        private object _tag;
        private bool _enabled;

        public event IWinMsgHookEvents_MessageEventHandler Message;

        public object Tag
        {
            get => _tag;
            set => _tag = value;
        }

        public bool Enabled
        {
            get => _enabled;
            set
            {
                if (value == _enabled) return;
                _enabled = value;

                if (InputServiceImpl.Instance != null)
                {
                    if (_enabled)
                        InputServiceImpl.Instance.RegisterMsgHook(this);
                    else
                        InputServiceImpl.Instance.UnregisterMsgHook(this);
                }
            }
        }

        internal void FireMessage(WinMsgHookImpl hook, WndMsgImpl msg)
        {
            Message?.Invoke((WinMsgHook)(object)hook, (WndMsg)(object)msg);
        }
    }
}
