using System.Linq;
using Microsoft.AspNetCore.Mvc;
using ElectronNET.API;
using ElectronNET.API.Entities;

namespace ElectronNET.WebApp.Controllers
{
    public class WindowsController : Controller
    {
        public IActionResult Index()
        {
            if (HybridSupport.IsElectronActive)
            {
                string viewPath = $"http://localhost:{ElectronNetRuntime.AspNetWebPort}/windows/demowindow";

                Electron.IpcMain.On("new-window", async (args) =>
                {
                    await Electron.WindowManager.CreateWindowAsync(viewPath);
                });

                Electron.IpcMain.On("manage-window", async (args) =>
                {

                    var browserWindow = await Electron.WindowManager.CreateWindowAsync(viewPath);
                    browserWindow.OnMove += UpdateReply;
                    browserWindow.OnResize += UpdateReply;
                });

                Electron.IpcMain.On("listen-to-window", async (args) =>
                {
                    var mainBrowserWindow = Electron.WindowManager.BrowserWindows.First();

                    var browserWindow = await Electron.WindowManager.CreateWindowAsync(viewPath);
                    browserWindow.OnFocus += () => Electron.IpcMain.Send(mainBrowserWindow, "listen-to-window-focus");
                    browserWindow.OnBlur += () => Electron.IpcMain.Send(mainBrowserWindow, "listen-to-window-blur");

                    _ = Electron.IpcMain.On("listen-to-window-set-focus", (x) => browserWindow.Focus());
                });

                Electron.IpcMain.On("frameless-window", async (args) =>
                {
                    var options = new BrowserWindowOptions
                    {
                        Frame = false
                    };
                    await Electron.WindowManager.CreateWindowAsync(options, viewPath);
                });
            }

            return View();
        }

        private async void UpdateReply()
        {
            var browserWindow = Electron.WindowManager.BrowserWindows.Last();
            var size = await browserWindow.GetSizeAsync();
            var position = await browserWindow.GetPositionAsync();
            string message = $"Size: {size[0]},{size[1]} Position: {position[0]},{position[1]}";

            var mainWindow = Electron.WindowManager.BrowserWindows.First();
            Electron.IpcMain.Send(mainWindow, "manage-window-reply", message);
        }

        public IActionResult DemoWindow()
        {
            return View();
        }
    }
}