using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Interop;
using System.Runtime.InteropServices;
using System.Threading;
using System.Timers;
using System.IO;

namespace StandAloneLauncher
{
    public partial class Form1 : Form
    {
        System.Windows.Interop.StandaloneGameServerCLI gameServer;
        bool serverIsRunning = false;
        bool gameIsStarted = false;

        public Form1()
        {
            InitializeComponent();


            string[] maps = Directory.GetFiles("..\\Content\\Worlds\\");
            for (int i = 0; i < maps.Length; i++)
            {
                string temp = maps[i].Split('\\').Last();
                string type = temp.Split('.').Last();
                if (type == "bias")
                {
                    this.mapName.Items.Add(temp);
                }
            }

            this.gameModes.SelectedIndex = 0;
            this.mapName.SelectedIndex = 0;
        }

        public bool Initiate()
        {
            this.gameServer = new StandaloneGameServerCLI();

            return true;
        }
     
        public void Run()
        {
            while (this.Created)
            {
                Application.DoEvents();
                this.gameServer.ServerUpdate();
                this.labelClientsConnected.Text = "Clients connected: " + this.gameServer.GetClientsConnectedCount().ToString();
            }
        }
        
        private void button1_serverToggle_Click(object sender, EventArgs e)
        {
            if (this.serverIsRunning)
            {
                if (gameIsStarted)
                {
                    //this.gameServer.GameStop();

                    this.gameIsStarted = false;
                    this.buttonStartGame.Text = "Start Game";
                    this.mapName.Enabled = true;
                    this.nrOfClients.Enabled = true;
                    this.gameModes.Enabled = true;
                    this.timeLimit.Enabled = true;
                    this.forceStart.Enabled = true;
                }

                this.serverIsRunning = false;
                this.gameServer.ServerStop();
                this.listenPort.Enabled = true;
                this.serverName.Enabled = true;
                this.lanBroadcast.Enabled = true;
                this.serverToggle.Text = "Start server";
                this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Server terminated!\n");
                this.panel_commands.Visible = false;
                //this.panelServerCommands.Visible = false;
            }
            else
            {
                ServerInitDesc desc = new ServerInitDesc();
                //desc.mainOptions.broadcast = this.lanBroadcast.Checked;
                desc.mainOptions.listenPort = (int)this.listenPort.Value;
                desc.mainOptions.serverName = this.serverName.Text;

                if (this.gameServer.ServerInitiate(desc) == DanBiasServerReturn.DanBiasServerReturn_Sucess)
                {
                    this.serverIsRunning = true;

                    GameServerInfo info = this.gameServer.ServerGetInfo();
                    this.Text = this.serverName.Text + " - " + info.serverIp;

                    this.listenPort.Enabled = false;
                    this.serverName.Enabled = false;
                    this.lanBroadcast.Enabled = false;
                    this.serverToggle.Text = "Stop server";
                    this.gameServer.ServerStart();
                    this.panel_commands.Visible = true;
                    this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Server initiated!\n\tListening on port " + this.listenPort.Value.ToString() + "\n\tLocal IP: " + info.serverIp + "\n");
                    //this.panelServerCommands.Visible = true;
                }
                else
                {
                    this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Failed to initiate the server!\n");
                }
            }
        }

        private void buttonStartGame_Click(object sender, EventArgs e)
        {
            if (!gameIsStarted)
            {
                //this.gameServer.GameSetGameMode(this.gameModes.SelectedText);
                this.gameServer.GameSetGameTime((int)this.timeLimit.Value);



                this.gameServer.GameSetMapName(this.mapName.Text);
                this.gameServer.GameSetMaxClients((int)this.nrOfClients.Value);

                if (!(gameIsStarted = this.gameServer.GameStart(this.forceStart.Checked)))
                {
                    this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Failed to start the game session!\n");
                }
                else
                {
                    this.ServerInfoTextArea.AppendText(DateTime.Now.ToUniversalTime() + "\n\t" + "Game session started!\n");
                    this.buttonStartGame.Text = "Stop Game";

                    this.mapName.Enabled = false;
                    this.nrOfClients.Enabled = false;
                    this.gameModes.Enabled = false;
                    this.timeLimit.Enabled = false;
                    this.forceStart.Enabled = false;
                }
            }
            else
            {
                //this.gameServer.GameStop();

                this.gameIsStarted = false;
                this.buttonStartGame.Text = "Start Game";
                this.mapName.Enabled        = true;
                this.nrOfClients.Enabled    = true;
                this.gameModes.Enabled      = true;
                this.timeLimit.Enabled      = true;
                this.forceStart.Enabled     = true;
            }
        }

        private void FormClosingEvent(object sender, FormClosingEventArgs e)
        {
            if (serverIsRunning)
            {
                this.gameServer.ServerStop();
            }
        }

        private void buttonAddNewDataField_Click(object sender, EventArgs e)
        {
            this.dataProtocolFields.RowCount++;
            this.dataProtocolFields.SetRow(this.buttonsAtBottom, this.dataProtocolFields.RowCount - 1);

            Panel p = new Panel();
            p = this.panel2;

            this.dataProtocolFields.RowStyles.Add(new RowStyle(SizeType.Absolute, 27));

        }

        private void mapName_SelectedIndexChanged(object sender, EventArgs e)
        {
            if ( this.panel_commands.Visible && (this.mapName.SelectedItem.ToString() == "Set directory"))
            {
                FolderBrowserDialog f = new FolderBrowserDialog();
                DialogResult r = f.ShowDialog();
                if (r == System.Windows.Forms.DialogResult.OK)
                {
                    this.mapName.Items.Clear();
                    this.mapName.Items.Add("Set directory");
                    string[] maps = Directory.GetFiles(f.SelectedPath);
                    for (int i = 0; i < maps.Length; i++)
                    {
                        string temp = maps[i].Split('\\').Last();
                        string type = temp.Split('.').Last();
                        if (type == "bias")
                        {
                            this.mapName.Items.Add(temp);
                        }
                    }
                }
            }
        }
    }
}