using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using Terminal.Gui;

namespace UICatalog.Scenarios;

[ScenarioMetadata ("Bars", "Illustrates Bar views (e.g. StatusBar)")]
[ScenarioCategory ("Controls")]
public class Bars : Scenario
{
    public override void Main ()
    {
        Application.Init ();
        Window app = new ();

        app.Loaded += App_Loaded;

        Application.Run (app);
        app.Dispose ();
        Application.Shutdown ();
    }


    // Setting everything up in Loaded handler because we change the
    // QuitKey and it only sticks if changed after init
    private void App_Loaded (object sender, EventArgs e)
    {
        Application.QuitKey = Key.Z.WithCtrl;
        Application.Top.Title = $"{Application.QuitKey} to Quit - Scenario: {GetName ()}";

        ObservableCollection<string> eventSource = new ();
        ListView eventLog = new ListView ()
        {
            X = Pos.AnchorEnd (),
            Width = 50,
            Height = Dim.Fill (6),
            ColorScheme = Colors.ColorSchemes ["Toplevel"],
            Source = new ListWrapper<string> (eventSource)
        };
        Application.Top.Add (eventLog);

        var shortcut1 = new Shortcut
        {
            Title = "_Zigzag",
            Key = Key.G.WithCtrl,
            Text = "Gonna zig zag",
        };
        shortcut1.Accept += (s, e) =>
                            {
                                eventSource.Add ($"Accept: {s}");
                                eventLog.MoveDown ();
                            };

        var shortcut2 = new Shortcut
        {
            Title = "Za_G",
            Text = "Gonna zag",
            Key = Key.G.WithAlt,
        };

        //var shortcut3 = new Shortcut
        //{
        //    Title = "Shortcut3",
        //    Key = Key.D3.WithCtrl,
        //    Text = "Number Three",
        //    KeyBindingScope = KeyBindingScope.Application,
        //    Command = Command.Accept,
        //};

        //shortcut3.Accept += (s, e) =>
        //                    {
        //                        eventSource.Add ($"Accept: {s}");
        //                        eventLog.MoveDown ();
        //                    };

        //var shortcut4 = new Shortcut
        //{
        //    Title = "Shortcut4",
        //    Text = "Number 4",
        //    Key = Key.F4,
        //    KeyBindingScope = KeyBindingScope.Application,
        //    Command = Command.Accept,
        //};

        //var cb = new CheckBox ()
        //{
        //    Title = "Hello",// shortcut4.Text
        //};

        //cb.Toggled += (s, e) =>
        //             {
        //                 eventSource.Add ($"Toggled: {s}");
        //                 eventLog.MoveDown ();
        //             };

        //shortcut4.CommandView = cb;

        //shortcut4.Accept += (s, e) =>
        //                    {
        //                        eventSource.Add ($"Accept: {s}");
        //                        eventLog.MoveDown ();
        //                    };

        var vBar = new Bar
        {
            X = 2,
            Y = 2,
            Orientation = Orientation.Vertical,
            BorderStyle = LineStyle.Rounded
        };
        vBar.Add (shortcut1, shortcut2);

        ////CheckBox hello = new ()
        ////{
        ////    Title = "Hello",
        ////    X = 0,
        ////    Y = 1,
        ////};
        ////Application.Top.Add (hello);
        ////hello.Toggled += (s, e) =>
        ////                 {
        ////                     eventSource.Add ($"Toggled: {s}");
        ////                     eventLog.MoveDown ();
        ////                 };


        Application.Top.Add (vBar);

        // BUGBUG: This should not be needed
        Application.Top.LayoutSubviews ();

        // SetupMenuBar ();
        //SetupContentMenu ();
        Label label = new Label ()
        {
            Title = "      Bar:",
            X = 0,
            Y = Pos.AnchorEnd () - 6
        };
        Application.Top.Add (label);
        var bar = new Bar
        {
            Id = "bar",
            X = Pos.Right (label),
            Y = Pos.Top (label),
            Width = Dim.Fill (),
            Orientation = Orientation.Horizontal,
        };
        ConfigStatusBar (bar);
        Application.Top.Add (bar);

        label = new Label ()
        {
            Title = "StatusBar:",
            X = 0,
            Y = Pos.AnchorEnd () - 3
        };
        Application.Top.Add (label);
        bar = new StatusBar()
        {
            Id = "statusBar",
            X = Pos.Right (label),
            Y = Pos.Top (label),
            Width = Dim.Fill (),
            Orientation = Orientation.Horizontal,
        };
        ConfigStatusBar (bar);
        Application.Top.Add (bar);

        foreach (Bar barView in Application.Top.Subviews.Where (b => b is Bar)!)
        {
            foreach (Shortcut sh in barView.Subviews.Where (s => s is Shortcut)!)
            {
                sh.Accept += (o, args) =>
                                   {
                                       eventSource.Add ($"Accept: {sh!.SuperView.Id} {sh!.CommandView.Text}");
                                       eventLog.MoveDown ();
                                   };
            }
        }
    }


    //private void SetupContentMenu ()
    //{
    //    Application.Top.Add (new Label { Text = "Right Click for Context Menu", X = Pos.Center (), Y = 4 });
    //    Application.Top.MouseClick += ShowContextMenu;
    //}

    //private void ShowContextMenu (object s, MouseEventEventArgs e)
    //{
    //    if (e.MouseEvent.Flags != MouseFlags.Button3Clicked)
    //    {
    //        return;
    //    }

    //    var contextMenu = new Bar
    //    {
    //        Id = "contextMenu",
    //        X = e.MouseEvent.Position.X,
    //        Y = e.MouseEvent.Position.Y,
    //        Width = Dim.Auto (DimAutoStyle.Content),
    //        Height = Dim.Auto (DimAutoStyle.Content),
    //        Orientation = Orientation.Vertical,
    //        StatusBarStyle = false,
    //        BorderStyle = LineStyle.Rounded,
    //        Modal = true,
    //    };

    //    var newMenu = new Shortcut
    //    {
    //        Title = "_New...",
    //        Text = "Create a new file",
    //        Key = Key.N.WithCtrl,
    //        CanFocus = true
    //    };

    //    newMenu.Accept += (s, e) =>
    //                      {
    //                          contextMenu.RequestStop ();

    //                          Application.AddTimeout (
    //                                                  new TimeSpan (0),
    //                                                  () =>
    //                                                  {
    //                                                      MessageBox.Query ("File", "New");

    //                                                      return false;
    //                                                  });
    //                      };

    //    var open = new Shortcut
    //    {
    //        Title = "_Open...",
    //        Text = "Show the File Open Dialog",
    //        Key = Key.O.WithCtrl,
    //        CanFocus = true
    //    };

    //    open.Accept += (s, e) =>
    //                   {
    //                       contextMenu.RequestStop ();

    //                       Application.AddTimeout (
    //                                               new TimeSpan (0),
    //                                               () =>
    //                                               {
    //                                                   MessageBox.Query ("File", "Open");

    //                                                   return false;
    //                                               });
    //                   };

    //    var save = new Shortcut
    //    {
    //        Title = "_Save...",
    //        Text = "Save",
    //        Key = Key.S.WithCtrl,
    //        CanFocus = true
    //    };

    //    save.Accept += (s, e) =>
    //                   {
    //                       contextMenu.RequestStop ();

    //                       Application.AddTimeout (
    //                                               new TimeSpan (0),
    //                                               () =>
    //                                               {
    //                                                   MessageBox.Query ("File", "Save");

    //                                                   return false;
    //                                               });
    //                   };

    //    var saveAs = new Shortcut
    //    {
    //        Title = "Save _As...",
    //        Text = "Save As",
    //        Key = Key.A.WithCtrl,
    //        CanFocus = true
    //    };

    //    saveAs.Accept += (s, e) =>
    //                     {
    //                         contextMenu.RequestStop ();

    //                         Application.AddTimeout (
    //                                                 new TimeSpan (0),
    //                                                 () =>
    //                                                 {
    //                                                     MessageBox.Query ("File", "Save As");

    //                                                     return false;
    //                                                 });
    //                     };

    //    contextMenu.Add (newMenu, open, save, saveAs);

    //    contextMenu.KeyBindings.Add (Key.Esc, Command.QuitToplevel);

    //    contextMenu.Initialized += Menu_Initialized;

    //    void Application_MouseEvent (object sender, MouseEvent e)
    //    {
    //        // If user clicks outside of the menuWindow, close it
    //        if (!contextMenu.Frame.Contains (e.Position.X, e.Position.Y))
    //        {
    //            if (e.Flags is (MouseFlags.Button1Clicked or MouseFlags.Button3Clicked))
    //            {
    //                contextMenu.RequestStop ();
    //            }
    //        }
    //    }

    //    Application.MouseEvent += Application_MouseEvent;

    //    Application.Run (contextMenu);
    //    contextMenu.Dispose ();

    //    Application.MouseEvent -= Application_MouseEvent;
    //}

    private void Menu_Initialized (object sender, EventArgs e)
    {
        // BUGBUG: this should not be needed    

        ((View)(sender)).LayoutSubviews ();
    }

    private void SetupMenuBar ()
    {
        var menuBar = new Bar
        {
            Id = "menuBar",
            Width = Dim.Fill (),
            Height = 1,//Dim.Auto (DimAutoStyle.Content),
            Orientation = Orientation.Horizontal,
        };

        var fileMenuBarItem = new Shortcut
        {
            Title = "_File",
            KeyBindingScope = KeyBindingScope.Application,
            Key = Key.F.WithAlt,
        };
        fileMenuBarItem.KeyView.Visible = false;

        var editMenuBarItem = new Shortcut
        {
            Title = "_Edit",

            KeyBindingScope = KeyBindingScope.HotKey,
        };

        editMenuBarItem.Accept += (s, e) => { };
        //editMenu.HelpView.Visible = false;
        //editMenu.KeyView.Visible = false;

        menuBar.Add (fileMenuBarItem, editMenuBarItem);
        menuBar.Initialized += Menu_Initialized;
        Application.Top.Add (menuBar);

        var fileMenu = new Bar
        {
            X = 1,
            Y = 1,
            Orientation = Orientation.Vertical,
            // Modal = true,
            Visible = false,
        };

        var newShortcut = new Shortcut
        {
            Title = "_New...",
            Text = "Create a new file",
            Key = Key.N.WithCtrl
        };
        newShortcut.Border.Thickness = new Thickness (0, 1, 0, 0);

        var openShortcut = new Shortcut
        {
            Title = "_Open...",
            Text = "Show the File Open Dialog",
            Key = Key.O.WithCtrl
        };

        var saveShortcut = new Shortcut
        {
            Title = "_Save...",
            Text = "Save",
            Key = Key.S.WithCtrl,
            Enabled = false
        };

        var exitShortcut = new Shortcut
        {
            Title = "E_xit",
            Text = "Exit",
            Key = Key.X.WithCtrl,
        };
        exitShortcut.Border.Thickness = new Thickness (0, 1, 0, 1);

        fileMenu.Add (newShortcut, openShortcut, saveShortcut, exitShortcut);

        View prevFocus = null;
        fileMenuBarItem.Accept += (s, e) =>
                              {
                                  if (fileMenu.Visible)
                                  {
                                      // fileMenu.RequestStop ();
                                      prevFocus?.SetFocus ();
                                      return;
                                  }

                                  //fileMenu.Visible = !fileMenu.Visible;
                                  var sender = s as Shortcut;
                                  var screen = sender.FrameToScreen ();
                                  fileMenu.X = screen.X;
                                  fileMenu.Y = screen.Y + 1;
                                  fileMenu.Visible = true;
                                  prevFocus = Application.Top.Focused;
                                  fileMenuBarItem.SetFocus ();
                                  //Application.Run (fileMenu);
                                  fileMenu.Visible = false;
                              };

        Application.Top.Closed += (s, e) =>
        {
            fileMenu.Dispose ();
        };

    }

    private void ConfigStatusBar (Bar bar)
    {
        var shortcut = new Shortcut
        {
            Height = Dim.Auto (DimAutoStyle.Content, 3),
            Text = "Quit",
            Title = "Q_uit",
            Key = Application.QuitKey,
            KeyBindingScope = KeyBindingScope.Application,
        };

        bar.Add (shortcut);

        shortcut = new Shortcut
        {
            Text = "Help Text",
            Title = "Help",
            Key = Key.F1,
            KeyBindingScope = KeyBindingScope.HotKey,
        };

        bar.Add (shortcut);

        shortcut = new Shortcut
        {
            Title = "_Show/Hide",
            Key = Key.F10,
            KeyBindingScope = KeyBindingScope.Application,
            CommandView = new CheckBox
            {
                Text = "_Show/Hide"
            },
        };

        bar.Add (shortcut);

        var button1 = new Button
        {
            Text = "I'll Hide",
            // Visible = false
        };
        button1.Accept += Button_Clicked;
        bar.Add (button1);

        shortcut.Accept += (s, e) =>
                                                    {
                                                        button1.Visible = !button1.Visible;
                                                        button1.Enabled = button1.Visible;
                                                        e.Cancel = false;
                                                    };

        bar.Add (new Label
        {
            HotKeySpecifier = new Rune ('_'),
            Text = "Fo_cusLabel",
            CanFocus = true
        });

        var button2 = new Button
        {
            Text = "Or me!",
        };
        button2.Accept += (s, e) => Application.RequestStop ();

        bar.Add (button2);

        return;

        void Button_Clicked (object sender, EventArgs e) { MessageBox.Query ("Hi", $"You clicked {sender}"); }

    }

}
