using System;
using System.Windows.Forms;
using PKHeX.Core;
using PKHeX.WinForms.Controls;

namespace PKHeX.WinForms
{
    public sealed partial class SAV_BoxViewer : Form
    {
        private readonly SAVEditor parent;

        public SAV_BoxViewer(SAVEditor p, SlotChangeManager m)
        {
            parent = p;
            InitializeComponent();
            int deltaW = Width - Box.BoxPokeGrid.Width;
            int deltaH = Height - Box.BoxPokeGrid.Height;
            Box.Editor = new BoxEdit(m.SE.SAV);
            Box.Setup(m);
            Box.InitializeGrid();

            Width = Box.BoxPokeGrid.Width + deltaW + 2;
            Height = Box.BoxPokeGrid.Height + deltaH + 2;

            Box.RecenterControls();
            Box.HorizontallyCenter(this);
            Box.Reset();
            CenterToParent();

            AllowDrop = true;
            GiveFeedback += (sender, e) => e.UseDefaultCursors = false;
            DragEnter += Main_DragEnter;
            DragDrop += (sender, e) =>
            {
                Cursor = DefaultCursor;
                System.Media.SystemSounds.Asterisk.Play();
            };
            Owner = p.ParentForm;

            MouseWheel += (s, e) =>
            {
                if (parent.menu.mnuVSD.Visible)
                    return;
                Box.CurrentBox = e.Delta > 1 ? Box.Editor.MoveLeft() : Box.Editor.MoveRight();
            };

            foreach (PictureBox pb in Box.SlotPictureBoxes)
                pb.ContextMenuStrip = parent.SlotPictureBoxes[0].ContextMenuStrip;
            Box.ResetBoxNames(); // fix box names
            Box.ResetSlots(); // refresh box background
            p.EditEnv.Slots.Publisher.Subscribers.Add(Box);
        }

        public int CurrentBox => Box.CurrentBox;
        private void PB_BoxSwap_Click(object sender, EventArgs e) => Box.CurrentBox = parent.SwapBoxesViewer(Box.CurrentBox);

        private static void Main_DragEnter(object? sender, DragEventArgs? e)
        {
            if (e is null)
                return;
            if (e.AllowedEffect == (DragDropEffects.Copy | DragDropEffects.Link)) // external file
                e.Effect = DragDropEffects.Copy;
            else if (e.Data != null) // within
                e.Effect = DragDropEffects.Move;
        }

        private void SAV_BoxViewer_FormClosing(object sender, FormClosingEventArgs e)
        {
            // Remove viewer from manager list
            Box.M?.Boxes.Remove(Box);
            parent.EditEnv.Slots.Publisher.Subscribers.Remove(Box);
        }
    }
}
