using Gtk;
using Ryujinx.HLE.FileSystem;
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;

using GUI = Gtk.Builder.ObjectAttribute;

namespace Ryujinx.Ui
{
    public class GameTableContextMenu : Menu
    {
        private static ListStore _gameTableStore;
        private static TreeIter  _rowIter;

#pragma warning disable CS0649
#pragma warning disable IDE0044
        [GUI] MenuItem _openSaveDir;
#pragma warning restore CS0649
#pragma warning restore IDE0044

        public GameTableContextMenu(ListStore gameTableStore, TreeIter rowIter) : this(new Builder("Ryujinx.Ui.GameTableContextMenu.glade"), gameTableStore, rowIter) { }

        private GameTableContextMenu(Builder builder, ListStore gameTableStore, TreeIter rowIter) : base(builder.GetObject("_contextMenu").Handle)
        {
            builder.Autoconnect(this);

            _openSaveDir.Activated += OpenSaveDir_Clicked;

            _gameTableStore = gameTableStore;
            _rowIter        = rowIter;
        }

        //Events
        private void OpenSaveDir_Clicked(object sender, EventArgs args)
        {
            string titleName = _gameTableStore.GetValue(_rowIter, 2).ToString().Split("\n")[0];
            string titleId   = _gameTableStore.GetValue(_rowIter, 2).ToString().Split("\n")[1].ToLower();
            string saveDir   = System.IO.Path.Combine(new VirtualFileSystem().GetNandPath(), "user", "save", "0000000000000000", "00000000000000000000000000000001", titleId, "0");

            if (!Directory.Exists(saveDir))
            {
                MessageDialog messageDialog = new MessageDialog(null, DialogFlags.Modal, MessageType.Question, ButtonsType.YesNo, null)
                {
                    Title          = "Ryujinx",
                    Icon           = new Gdk.Pixbuf(Assembly.GetExecutingAssembly(), "Ryujinx.Ui.assets.Icon.png"),
                    Text           = $"Could not find save directory for {titleName} [{titleId}]",
                    SecondaryText  = "Would you like to create the directory?",
                    WindowPosition = WindowPosition.Center
                };

                if (messageDialog.Run() == (int)ResponseType.Yes)
                {
                    Directory.CreateDirectory(saveDir);
                }
                else
                {
                    messageDialog.Dispose();

                    return;
                }

                messageDialog.Dispose();
            }

            Process.Start(new ProcessStartInfo()
            {
                FileName        = saveDir,
                UseShellExecute = true,
                Verb            = "open"
            });
        }
    }
}