using System;
using System.IO;
using CefBridgeDataExchange.Tests.Resources;
using CefSharp;
using CefSharp.WinForms;

namespace CefBridgeDataExchange.Tests.CefRelated
{
    internal static class CefInit
    {
        public static readonly string ResourceSchemeName = $"cef-custom-scheme-{Guid.NewGuid()}".ToLower();
        public static readonly string ResourceDomainName = $"app-{Guid.NewGuid()}";
        public static readonly string ResourceRootUrl = $"{ResourceSchemeName}://{ResourceDomainName}/";

        public static void Init()
        {
            CefSharpSettings.LegacyJavascriptBindingEnabled = true;

            var settings = new CefSettings();
            settings.BrowserSubprocessPath = Path.Combine(Environment.Is64BitProcess ? "x64" : "x86", settings.BrowserSubprocessPath);
            settings.LogSeverity = LogSeverity.Disable;
            settings.CefCommandLineArgs.Add("-incognito", "");
            settings.CefCommandLineArgs.Add("--disable-application-cache", "");
            settings.CefCommandLineArgs.Add("--disable-cache", "");
            settings.CefCommandLineArgs.Add("--disable-gpu-program-cache", "");
            settings.CefCommandLineArgs.Add("--disable-gpu-shader-disk-cache", "");
            settings.CefCommandLineArgs.Add("--disable-local-storage", "");

            settings.RegisterScheme(new CefCustomScheme
            {
                SchemeName = ResourceSchemeName,
                DomainName = ResourceDomainName,
                SchemeHandlerFactory = new ResourceSchemeHandlerFactory(),
            });

            Cef.Initialize(settings);
        }

        public static void Quit()
        {
            Cef.Shutdown();
        }
    }

    internal class ResourceSchemeHandlerFactory : ISchemeHandlerFactory
    {
        IResourceHandler ISchemeHandlerFactory.Create(IBrowser browser, IFrame frame, string schemeName, IRequest request)
        {
            var path = new Uri(request.Url).LocalPath.TrimStart('/');
            var resource = ResourceLoader.GetBinResource(path);
            return new ResourceHandler(ResourceHandler.GetMimeType(Path.GetExtension(path)), new MemoryStream(resource, false), true);
        }
    }
}