using System.Drawing;
using System.Windows.Forms;
using CefSharp;
using TweetDuck.Controls;
using TweetDuck.Dialogs;
using TweetDuck.Utils;

namespace TweetDuck.Browser.Handling.General{
    sealed class JavaScriptDialogHandler : IJsDialogHandler{
        private static FormMessage CreateMessageForm(string caption, string text){
            MessageBoxIcon icon = MessageBoxIcon.None;
            int pipe = text.IndexOf('|');

            if (pipe != -1){
                icon = text.Substring(0, pipe) switch{
                    "error"    => MessageBoxIcon.Error,
                    "warning"  => MessageBoxIcon.Warning,
                    "info"     => MessageBoxIcon.Information,
                    "question" => MessageBoxIcon.Question,
                    _          => MessageBoxIcon.None
                };

                if (icon != MessageBoxIcon.None){
                    text = text.Substring(pipe + 1);
                }
            }

            return new FormMessage(caption, text, icon);
        }

        bool IJsDialogHandler.OnJSDialog(IWebBrowser browserControl, IBrowser browser, string originUrl, CefJsDialogType dialogType, string messageText, string defaultPromptText, IJsDialogCallback callback, ref bool suppressMessage){
            browserControl.AsControl().InvokeSafe(() => {
                FormMessage form;
                TextBox input = null;

                if (dialogType == CefJsDialogType.Alert){
                    form = CreateMessageForm("Browser Message", messageText);
                    form.AddButton(FormMessage.OK, ControlType.Accept | ControlType.Focused);
                }
                else if (dialogType == CefJsDialogType.Confirm){
                    form = CreateMessageForm("Browser Confirmation", messageText);
                    form.AddButton(FormMessage.No, DialogResult.No, ControlType.Cancel);
                    form.AddButton(FormMessage.Yes, ControlType.Focused);
                }
                else if (dialogType == CefJsDialogType.Prompt){
                    form = CreateMessageForm("Browser Prompt", messageText);
                    form.AddButton(FormMessage.Cancel, DialogResult.Cancel, ControlType.Cancel);
                    form.AddButton(FormMessage.OK, ControlType.Accept | ControlType.Focused);

                    float dpiScale = form.GetDPIScale();
                    int inputPad = form.HasIcon ? 43 : 0;

                    input = new TextBox{
                        Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
                        Font = SystemFonts.MessageBoxFont,
                        Location = new Point(BrowserUtils.Scale(22 + inputPad, dpiScale), form.ActionPanelY - BrowserUtils.Scale(46, dpiScale)),
                        Size = new Size(form.ClientSize.Width - BrowserUtils.Scale(44 + inputPad, dpiScale), BrowserUtils.Scale(23, dpiScale))
                    };

                    form.Controls.Add(input);
                    form.ActiveControl = input;
                    form.Height += input.Size.Height + input.Margin.Vertical;
                }
                else{
                    callback.Continue(false);
                    return;
                }

                bool success = form.ShowDialog() == DialogResult.OK;

                if (input == null){
                    callback.Continue(success);
                }
                else{
                    callback.Continue(success, input.Text);
                    input.Dispose();
                }

                form.Dispose();
            });

            return true;
        }

        bool IJsDialogHandler.OnJSBeforeUnload(IWebBrowser browserControl, IBrowser browser, string message, bool isReload, IJsDialogCallback callback){
            return false;
        }

        void IJsDialogHandler.OnResetDialogState(IWebBrowser browserControl, IBrowser browser){}
        void IJsDialogHandler.OnDialogClosed(IWebBrowser browserControl, IBrowser browser){}
    }
}