using System;
using System.IO;
using CefSharp;
using CefSharp.SchemeHandler;
using CefSharp.WinForms;

namespace VRCX
{
    public class CefService
    {
        public static readonly CefService Instance;

        static CefService()
        {
            Instance = new CefService();
        }

        internal void Init()
        {
            var cefSettings = new CefSettings
            {
                CachePath = Path.Combine(Program.AppDataDirectory, "cache"),
                UserDataPath = Path.Combine(Program.AppDataDirectory, "userdata"),
                LogSeverity = LogSeverity.Disable,
                WindowlessRenderingEnabled = true,
                PersistSessionCookies = true,
                PersistUserPreferences = true,
                UserAgent = Program.Version
            };

            cefSettings.RegisterScheme(new CefCustomScheme
            {
                SchemeName = "file",
                DomainName = "vrcx",
                SchemeHandlerFactory = new FolderSchemeHandlerFactory(
                    Path.Combine(Program.BaseDirectory, "html"),
                    "file",
                    defaultPage: "index.html"
                ),
                IsLocal = true
            });

            // cefSettings.CefCommandLineArgs.Add("allow-universal-access-from-files");
            // cefSettings.CefCommandLineArgs.Add("ignore-certificate-errors");
            // cefSettings.CefCommandLineArgs.Add("disable-plugins");
            cefSettings.CefCommandLineArgs.Add("disable-spell-checking");
            cefSettings.CefCommandLineArgs.Add("disable-pdf-extension");
            cefSettings.CefCommandLineArgs["autoplay-policy"] = "no-user-gesture-required";
            cefSettings.CefCommandLineArgs.Add("disable-web-security");
            cefSettings.SetOffScreenRenderingBestPerformanceArgs(); // causes white screen sometimes?

            if (Program.LaunchDebug)
            {
                cefSettings.RemoteDebuggingPort = 8088;
                cefSettings.CefCommandLineArgs["remote-allow-origins"] = "*";
            }

            CefSharpSettings.WcfEnabled = true; // TOOD: REMOVE THIS LINE YO (needed for synchronous configRepository)
            CefSharpSettings.ShutdownOnExit = false;

            if (Cef.Initialize(cefSettings) == false)
            {
                throw new Exception("Cef.Initialize()");
            }
        }

        internal void Exit()
        {
            Cef.Shutdown();
        }
    }
}