using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

#if false
namespace Quik.Media.Defaults.Win32
{

    public class EnumerateFonts
    {
        private const byte DEFAULT_CHARSET = 1;

        public static void Enumerate(FontFace font)
        {
            /* It's windows, just borrow the desktop window. */
            IntPtr hdc = GetDC(GetDesktopWindow());

            List<(LogFontA, TextMetricA)> list = new List<(LogFontA, TextMetricA)>();

            LogFontA font2 = new LogFontA()
            {
                //FaceName = font.Family,
                Weight = ((font.Style & FontStyle.Bold) != 0) ? FontWeight.Bold : FontWeight.Regular,
                Italic = (font.Style & FontStyle.Italic) != 0,
                CharSet = DEFAULT_CHARSET
            };

            Console.WriteLine(font2.FaceName);

            EnumFontFamiliesExProc proc = (in LogFontA font, in TextMetricA metric, int type, IntPtr lparam) =>
            {
                list.Add((font, metric));
                return 0;
            };

            EnumFontFamiliesExA(hdc, font2, proc, IntPtr.Zero, 0);
        }

        private const string gdi32 = "Gdi32.dll";
        private const string user32 = "User32.dll";

        [DllImport(gdi32)]
        private static extern int EnumFontFamiliesExA(
            IntPtr hdc, 
            in LogFontA font, 
            [MarshalAs(UnmanagedType.FunctionPtr)] EnumFontFamiliesExProc proc, 
            IntPtr lparam, 
            int flags /* Should be zero. */);

        [DllImport(user32)]
        private static extern IntPtr /* HWND */ GetDesktopWindow();

        [DllImport(user32)]
        private static extern IntPtr /* HDC */ GetDC(IntPtr hwnd);

        private delegate int EnumFontFamiliesExProc(in LogFontA font, in TextMetricA metric, int fontType, IntPtr lParam);
        
        private struct LogFontA
        {
            public long Height;
            public long Width;
            public long Escapement;
            public long Orientation;
            public FontWeight Weight;
            [MarshalAs(UnmanagedType.U1)]
            public bool Italic;
            [MarshalAs(UnmanagedType.U1)]
            public bool Underline;
            [MarshalAs(UnmanagedType.U1)]
            public bool StrikeOut;
            public byte CharSet;
            public byte OutPrecision;
            public byte ClipPrecision;
            public byte PitchAndFamily;
            private unsafe fixed byte aFaceName[32];
            public unsafe string FaceName
            {
                get
                {
                    fixed (byte* str = aFaceName)
                    {
                        int len = 0;
                        for (; str[len] != 0 && len < 32; len++) ;
                        return Encoding.UTF8.GetString(str, len);
                    }
                }

                set
                {
                    fixed (byte *str = aFaceName)
                    {
                        Span<byte> span = new Span<byte>(str, 32);
                        Encoding.UTF8.GetBytes(value, span);
                        span[31] = 0;
                    }
                }
            }
        }

        private struct TextMetricA
        {
            public long Height;
            public long Ascent;
            public long Descent;
            public long InternalLeading;
            public long ExternalLeading;
            public long AveCharWidth;
            public long MaxCharWidth;
            public long Weight;
            public long Overhang;
            public long DigitizedAspectX;
            public long DigitizedAspectY;
            public byte FirstChar;
            public byte LastChar;
            public byte DefaultChar;
            public byte BreakChar;
            public byte Italic;
            public byte Underlined;
            public byte StruckOut;
            public byte PitchAndFamily;
            public byte CharSet;
        }

        private enum FontWeight : long
        { 
            DontCare = 0,
            Thin = 100,
            ExtraLight = 200,
            UltraLight = 200,
            Light = 300,
            Normal = 400,
            Regular = 400,
            Medium = 500,
            Semibold = 600,
            Demibold = 600,
            Bold = 700,
            Extrabold = 800,
            Ultrabold = 800,
            Heavy = 900,
            Black = 900
        }
    }


}
#endif