using System;
using HandyControl.Tools.Interop;

namespace HandyControl.Data;

internal class GlowDrawingContext : DisposableObject
{
    private readonly GlowBitmap _windowBitmap;

    internal InteropValues.BLENDFUNCTION Blend;

    internal GlowDrawingContext(int width, int height)
    {
        ScreenDC = InteropMethods.GetDC(IntPtr.Zero);
        if (ScreenDC == IntPtr.Zero) return;
        WindowDC = InteropMethods.CreateCompatibleDC(ScreenDC);
        if (WindowDC == IntPtr.Zero) return;
        BackgroundDC = InteropMethods.CreateCompatibleDC(ScreenDC);
        if (BackgroundDC == IntPtr.Zero) return;
        Blend.BlendOp = 0;
        Blend.BlendFlags = 0;
        Blend.SourceConstantAlpha = 255;
        Blend.AlphaFormat = 1;
        _windowBitmap = new GlowBitmap(ScreenDC, width, height);
        InteropMethods.SelectObject(WindowDC, _windowBitmap.Handle);
    }

    internal bool IsInitialized =>
        ScreenDC != IntPtr.Zero && WindowDC != IntPtr.Zero &&
        BackgroundDC != IntPtr.Zero && _windowBitmap != null;

    internal IntPtr ScreenDC { get; }

    internal IntPtr WindowDC { get; }

    internal IntPtr BackgroundDC { get; }

    internal int Width => _windowBitmap.Width;

    internal int Height => _windowBitmap.Height;

    protected override void DisposeManagedResources() => _windowBitmap.Dispose();

    protected override void DisposeNativeResources()
    {
        if (ScreenDC != IntPtr.Zero) InteropMethods.ReleaseDC(IntPtr.Zero, ScreenDC);
        if (WindowDC != IntPtr.Zero) InteropMethods.DeleteDC(WindowDC);
        if (BackgroundDC != IntPtr.Zero) InteropMethods.DeleteDC(BackgroundDC);
    }
}
