using System;
using System.Diagnostics;
using System.Windows.Forms;
using TweetDuck.Configuration;
using TweetDuck.Core.Controls;
using TweetDuck.Core.Other.Settings.Dialogs;
using TweetDuck.Core.Utils;

namespace TweetDuck.Core.Other.Settings{
    sealed partial class TabSettingsAdvanced : BaseTabSettings{
        private static SystemConfig SysConfig => Program.SystemConfig;

        private readonly Action<string> reinjectBrowserCSS;

        public TabSettingsAdvanced(Action<string> reinjectBrowserCSS){
            InitializeComponent();

            this.reinjectBrowserCSS = reinjectBrowserCSS;

            if (SystemConfig.IsHardwareAccelerationSupported){
                checkHardwareAcceleration.Checked = SysConfig.HardwareAcceleration;
            }
            else{
                checkHardwareAcceleration.Enabled = false;
                checkHardwareAcceleration.Checked = false;
            }
            
            BrowserCache.CalculateCacheSize(task => {
                string text = task.IsCompleted ? (int)Math.Ceiling(task.Result/(1024.0*1024.0))+" MB" : "(unknown size)";
                this.InvokeSafe(() => btnClearCache.Text = $"Clear Cache ({text})");
            });
        }

        public override void OnReady(){
            btnClearCache.Click += btnClearCache_Click;
            checkHardwareAcceleration.CheckedChanged += checkHardwareAcceleration_CheckedChanged;
            
            btnEditCefArgs.Click += btnEditCefArgs_Click;
            btnEditCSS.Click += btnEditCSS_Click;
            
            btnOpenAppFolder.Click += btnOpenAppFolder_Click;
            btnOpenDataFolder.Click += btnOpenDataFolder_Click;
            btnRestart.Click += btnRestart_Click;
            btnRestartArgs.Click += btnRestartArgs_Click;
        }

        public override void OnClosing(){
            SysConfig.Save();
        }

        private void btnClearCache_Click(object sender, EventArgs e){
            btnClearCache.Enabled = false;
            BrowserCache.SetClearOnExit();
            FormMessage.Information("Clear Cache", "Cache will be automatically cleared when TweetDuck exits.", FormMessage.OK);
        }

        private void checkHardwareAcceleration_CheckedChanged(object sender, EventArgs e){
            SysConfig.HardwareAcceleration = checkHardwareAcceleration.Checked;
            PromptRestart(); // calls OnClosing
        }

        private void btnEditCefArgs_Click(object sender, EventArgs e){
            DialogSettingsCefArgs form = new DialogSettingsCefArgs();

            form.VisibleChanged += (sender2, args2) => {
                form.MoveToCenter(ParentForm);
            };

            form.FormClosed += (sender2, args2) => {
                RestoreParentForm();

                if (form.DialogResult == DialogResult.OK){
                    Config.CustomCefArgs = form.CefArgs;
                    PromptRestart();
                    form.Dispose();
                }
                else form.Dispose();
            };
            
            form.Show(ParentForm);
            NativeMethods.SetFormDisabled(ParentForm, true);
        }

        private void btnEditCSS_Click(object sender, EventArgs e){
            DialogSettingsCSS form = new DialogSettingsCSS(reinjectBrowserCSS);

            form.VisibleChanged += (sender2, args2) => {
                form.MoveToCenter(ParentForm);
            };

            form.FormClosed += (sender2, args2) => {
                RestoreParentForm();

                if (form.DialogResult == DialogResult.OK){
                    Config.CustomBrowserCSS = form.BrowserCSS;
                    Config.CustomNotificationCSS = form.NotificationCSS;
                }

                reinjectBrowserCSS(Config.CustomBrowserCSS); // reinject on cancel too, because the CSS is updated while typing
                form.Dispose();
            };
            
            form.Show(ParentForm);
            NativeMethods.SetFormDisabled(ParentForm, true);
        }

        private void btnOpenAppFolder_Click(object sender, EventArgs e){
            using(Process.Start("explorer.exe", "\""+Program.ProgramPath+"\"")){}
        }

        private void btnOpenDataFolder_Click(object sender, EventArgs e){
            using(Process.Start("explorer.exe", "\""+Program.StoragePath+"\"")){}
        }

        private void btnRestart_Click(object sender, EventArgs e){
            Program.Restart();
        }

        private void btnRestartArgs_Click(object sender, EventArgs e){
            using(DialogSettingsRestart dialog = new DialogSettingsRestart(Arguments.GetCurrentClean())){
                if (dialog.ShowDialog() == DialogResult.OK){
                    Program.RestartWithArgs(dialog.Args);
                }
            }
        }

        private void RestoreParentForm(){
            if (ParentForm != null){ // when the parent is closed first, ParentForm is null in FormClosed event
                NativeMethods.SetFormDisabled(ParentForm, false);
            }
        }
    }
}