using PuzzlePlayer_Namespace.Resources;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;

namespace PuzzlePlayer_Namespace
{
    internal class Program
    {
        internal static void Main(string[] args)
        {
            Application.Run(new ShopMenu());//new MainForm());
        }
    }

    internal class MainForm : Form
    {
        List<PuzzleForm> puzzleForms = new List<PuzzleForm>();
        BlackJack bj;
        public MainForm()
        {
            SetUpPuzzleForms();
            SetUpUI();
        }

        private void SetUpPuzzleForms()
        {
            puzzleForms.Clear();
            puzzleForms.Add(new PuzzleForm(new Binary()));
            puzzleForms.Add(new PuzzleForm(new Maze()));
            puzzleForms.Add(new PuzzleForm(new Sudoku()));
            puzzleForms.Add(new PuzzleForm(new Minesweeper()));
        }

        private void SetUpUI()
        {
            this.ClientSize = new Size(1115, 755);
            this.BackColor = UserDataManager.Theme.primaryColor;
            this.Text = "PuzzlePlayer";

            MenuStrip menuStrip = new MenuStrip
            {
                BackColor = UserDataManager.Theme.secondaryColor,
                ForeColor = UserDataManager.Theme.secondaryColor,
                Name = "Main menu",
                Text = "Main Menu",
                Dock = DockStyle.Top,
                Font = UserDataManager.MainFont,
            };

            ToolStripMenuItem menuSettings = new ToolStripMenuItem 
            {
                BackColor = Color.FromArgb(54, 57, 62),
                ForeColor = Color.Black,
                Text = "Settings",
                TextAlign = ContentAlignment.BottomRight,
                Font = UserDataManager.MainFont,
            };

            menuSettings.Click += (object o, EventArgs e) =>
            {
                this.Hide();
                SettingForm settingForm = new SettingForm();

                settingForm.FormClosed += (object s, FormClosedEventArgs args) =>
                {
                    this.BackColor = UserDataManager.Theme.primaryColor;
                    this.ForeColor = UserDataManager.Theme.tertiaryColor;

                    foreach (Control control in this.Controls)
                    {
                        SettingForm.UpdateControl(control);
                    }

                    this.Show();
                };

                settingForm.Show();
            };

            // Create a flow layout panel that automatically sorts the buttons when the window is resized
            FlowLayoutPanel buttonsPanel = new FlowLayoutPanel
            {
                Location = new Point(0, menuStrip.Height),
                Size = new Size(ClientSize.Width, ClientSize.Height - menuStrip.Height),
                Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
                FlowDirection = FlowDirection.LeftToRight,
                // Add another row if there are more buttons than that fit in the window horizontally
                WrapContents = true,
                // Add a scroll bar in case the buttons don't fit on the window vertically
                AutoScroll = true,
            };

            // Add a button for each puzzle type
            for (int i = 0; i < puzzleForms.Count; i++)
            {
                string image = puzzleForms[i].puzzleType;

                Image normalImage = SettingForm.GetEmbeddedImage(image + ".jpg");
                Image grayImage = SettingForm.GetEmbeddedImage(image + "Gray.jpg");

                // Set the name of the button
                RoundedButton button = new RoundedButton
                {
                    Text = puzzleForms[i].puzzleType,
                    Margin = new Padding(10),
                    Height = 345,
                    Width = 345,
                    Image = normalImage,
                    FlatStyle = FlatStyle.Flat,
                    Font = new Font(UserDataManager.MainFont.Name, UserDataManager.MainFont.Size * 2,FontStyle.Bold),
                    Name = i.ToString()
                };

                button.MouseEnter += (object o, EventArgs e) =>
                {
                    button.Image = grayImage;
                };

                button.MouseLeave += (object o, EventArgs e) =>
                {
                    button.Image = normalImage;
                };

                button.MouseClick += (object o, MouseEventArgs e) =>
                {
                    this.Hide();
                    RoundedButton rb = (RoundedButton) o;

                    PuzzleForm puzzleForm = puzzleForms[int.Parse(rb.Name)];
                    puzzleForm.FormClosed += (object o, FormClosedEventArgs fcea) =>
                    {
                        this.BackColor = UserDataManager.Theme.primaryColor;
                        this.ForeColor = UserDataManager.Theme.tertiaryColor;

                        foreach (Control control in this.Controls)
                        {
                            SettingForm.UpdateControl(control);
                        }

                        this.Show();
                    };
                    puzzleForm.Show();
                    puzzleForm.Board.Generate();
                    SetUpPuzzleForms(); //cheeky dwdw
                };
                buttonsPanel.Controls.Add(button);
                // -- buttons.Add(button);

                if (i == 0)
                {
                    this.MinimumSize = new Size(button.Width + 56, button.Height + 83);
                }
            }
            // add BlackJackbutton
            buttonsPanel.Controls.Add(SetUpBlackJackButton());

            this.Controls.Add(menuStrip);
            this.Controls.Add(buttonsPanel);

            menuStrip.Items.Add(menuSettings);
            menuStrip.BringToFront();
        }

        RoundedButton SetUpBlackJackButton()
        {
            Image normalImage = SettingForm.GetEmbeddedImage("blackjackImg.jpg");
            Image grayImage = SettingForm.GetEmbeddedImage("blackjackImgGray.jpg");

            RoundedButton blackJackButton = new RoundedButton();
            bj = new BlackJack();
            blackJackButton.Text = "BlackJack";
            blackJackButton.Margin = new Padding(10);
            blackJackButton.Height = 345;
            blackJackButton.Width = 345;
            blackJackButton.Image = normalImage;
            blackJackButton.FlatStyle = FlatStyle.Flat;
            blackJackButton.Font = new Font(UserDataManager.MainFont.Name, UserDataManager.MainFont.Size * 2,FontStyle.Bold);
            blackJackButton.Click += (object o, EventArgs e) => {
                this.Hide();

                bj.FormClosed += (object o, FormClosedEventArgs fcea) =>
                {
                    this.BackColor = UserDataManager.Theme.primaryColor;
                    this.ForeColor = UserDataManager.Theme.tertiaryColor;

                    foreach (Control control in this.Controls)
                    {
                        SettingForm.UpdateControl(control);
                    }

                    this.Show();
                    bj = new BlackJack(); //cheeky dw
                };
                bj.Show();

            };

            blackJackButton.MouseEnter += (object o, EventArgs e) =>
            {
                blackJackButton.Image = grayImage;
            };

            blackJackButton.MouseLeave += (object o, EventArgs e) =>
            {
                blackJackButton.Image = normalImage;
            };

            return blackJackButton;
        }
    }

    
}