using System;
using System.Windows.Interop;
using HandyControl.Tools.Interop;

namespace HandyControl.Tools
{
    public class ClipboardHook
    {
        public static event Action ContentChanged;

        private static HwndSource HWndSource;

        private static IntPtr HookId = IntPtr.Zero;

        private static int Count;

        public static void Start()
        {
            if (HookId == IntPtr.Zero)
            {
                HookId = WindowHelper.CreateHandle();
                HWndSource = HwndSource.FromHwnd(HookId);
                if (HWndSource != null)
                {
                    HWndSource.AddHook(WinProc);
                    InteropMethods.AddClipboardFormatListener(HookId);
                }
            }

            if (HookId != IntPtr.Zero)
            {
                Count++;
            }
        }

        public static void Stop()
        {
            Count--;
            if (Count < 1)
            {
                HWndSource.RemoveHook(WinProc);
                InteropMethods.RemoveClipboardFormatListener(HookId);

                HookId = IntPtr.Zero;
            }
        }

        private static IntPtr WinProc(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
        {
            if (msg == InteropValues.WM_CLIPBOARDUPDATE)
            {
                ContentChanged?.Invoke();
            }
            return IntPtr.Zero;
        }
    }
}
