using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using BirdsiteLive.Common.Settings;
using BirdsiteLive.DAL.Contracts;
using Microsoft.Extensions.Configuration;
using NStack;
using Terminal.Gui;

namespace BSLManager
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.OutputEncoding = Encoding.Default;

            var settings = GetSettings();

            var bootstrapper = new Bootstrapper(settings);
            var container = bootstrapper.Init();

            var followersDal = container.GetInstance<IFollowersDal>();

            await LaunchAppAsync(followersDal);
        }

        private static DbSettings GetSettings()
        {
            var builder = new ConfigurationBuilder()
                .AddEnvironmentVariables();
            var configuration = builder.Build();

            var dbSettings = configuration.GetSection("Db").Get<DbSettings>();
            return dbSettings;
        }

        private static async Task LaunchAppAsync(IFollowersDal followersDal)
        {
            var followers = await followersDal.GetAllFollowersAsync();
            var orderedFollowers = followers.OrderByDescending(x => x.Followings.Count).ToList();

            Application.Init();
            var top = Application.Top;

            // Creates the top-level window to show
            var win = new Window("BSL Manager")
            {
                X = 0,
                Y = 1, // Leave one row for the toplevel menu

                // By using Dim.Fill(), it will automatically resize without manual intervention
                Width = Dim.Fill(),
                Height = Dim.Fill()
            };

            top.Add(win);

            // Creates a menubar, the item "New" has a help menu.
            var menu = new MenuBar(new MenuBarItem[]
            {
                new MenuBarItem("_File", new MenuItem[]
                {
                    new MenuItem("_Quit", "", () =>
                    {
                        if (Quit()) top.Running = false;
                    })
                }),
                //new MenuBarItem ("_Edit", new MenuItem [] {
                //    new MenuItem ("_Copy", "", null),
                //    new MenuItem ("C_ut", "", null),
                //    new MenuItem ("_Paste", "", null)
                //})
            });
            top.Add(menu);

            static bool Quit()
            {
                var n = MessageBox.Query(50, 7, "Quit BSL Manager", "Are you sure you want to quit?", "Yes", "No");
                return n == 0;
            }

            var listData = new List<string>();
            foreach (var follower in orderedFollowers)
            {
                listData.Add($"@{follower.Acct}@{follower.Host}     {follower.Followings.Count}");
            }

            var list = new ListView(listData)
            {
                X = 1,
                Y = 2,
                Width = Dim.Fill(),
                Height = Dim.Fill()
            };

            list.KeyDown += _ =>
            {
                if (_.KeyEvent.Key == Key.Enter)
                {
                    var el = list.SelectedItem;

                    bool okpressed = false;
                    var ok = new Button(10, 14, "Yes");
                    ok.Clicked += () =>
                    {
                        Application.RequestStop();
                        okpressed = true;
                    };

                    var cancel = new Button(3, 14, "No");
                    cancel.Clicked += () => Application.RequestStop();

                    var dialog = new Dialog("Delete", 60, 18, cancel, ok);

                    var name = new Label($"User: {listData[el]}")
                    {
                        X = 1,
                        Y = 1,
                        Width = Dim.Fill(),
                        Height = 1
                    };
                    var entry = new Label("Delete user and remove all their followings?")
                    {
                        X = 1,
                        Y = 3,
                        Width = Dim.Fill(),
                        Height = 1
                    };
                    dialog.Add(name);
                    dialog.Add(entry);
                    Application.Run(dialog);

                    if (okpressed)
                    {
                        listData.RemoveAt(el);
                        typeof(Application).GetMethod("TerminalResized", BindingFlags.Static | BindingFlags.NonPublic)
                            .Invoke(null, null);
                    }
                }
            };

            // Add some controls, 
            win.Add(
                new Label(1, 0, "Listing followers"),
                list
            );

            Application.Run();
        }
    }
}
