// An HTTP Server, and Horse Isle Server, Flash Player, in a single package
// Idea is to just be open and play.

using HISP.Game;
using HISP.Game.Chat;
using HISP.Game.Horse;
using HISP.Game.Items;
using HISP.Game.Services;
using HISP.Game.SwfModules;
using HISP.Security;
using HISP.Server;
using HTTP;

using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace HISP.Noobs
{
    public static class Program
    {
        public static Random rand = new Random(Guid.NewGuid().GetHashCode());
        private static LoadingForm lfrm;
        public static string BaseDir;
        private static ContentServer cs;
        private static void addToList(string path)
        {
            string Name = path.Remove(0, Path.Combine(Directory.GetCurrentDirectory(), "client").Length);
            Name = Name.Replace("\\", "/");

            ContentItem ci = new ContentItem(Name, path);
            cs.Contents.Add(ci);

        }

        public static void OnShutdown()
        {
            if (!Process.GetCurrentProcess().CloseMainWindow())
                Process.GetCurrentProcess().Close();
        }

        public static void StartLRFrm()
        {
            if (lfrm.ShowDialog() == DialogResult.Cancel)
            {
                GameServer.ShutdownServer();
            }
        }

        public static void IncrementProgress()
        {
            if (lfrm.InvokeRequired)
            {
                lfrm.Invoke(() =>
                {
                    lfrm.StartProgress.Increment(1);
                });
            }
            else
            {
                lfrm.StartProgress.Increment(1);
            }
        }
        public static string GetOctlet()
        {
            return rand.Next(0, 255).ToString();
        }


        public static void Main(string[] args)
        {
            BaseDir = Path.Combine(Environment.GetEnvironmentVariable("APPDATA"), "HISP", "N00BS");
            Directory.CreateDirectory(BaseDir);


            // Start Web Server
            try
            {
                cs = new ContentServer("127.0.0.1");
                string[] fileList = Directory.GetFiles(Path.Combine(Directory.GetCurrentDirectory(), "client"), "*", SearchOption.AllDirectories);
                foreach (string file in fileList)
                    addToList(file);
            }
            catch (Exception e)
            {
                MessageBox.Show("Web server failed to start: " + e.Message, "Error starting web server", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            MpOrSp mporsp = new MpOrSp();
            if (mporsp.ShowDialog() != DialogResult.OK)
                return;

            if (mporsp.Mutliplayer)
            {
                ServerSelection ssel = new ServerSelection();
                ssel.ShowDialog();
            }
            else
            {
                lfrm = new LoadingForm();
                Task startForm = new Task(StartLRFrm);
                startForm.Start();

                ConfigReader.ConfigurationFileName = Path.Combine(BaseDir, "server.properties");
                ConfigReader.OpenConfig();
                ConfigReader.SqlLite = true;
                ConfigReader.LogLevel = 0;
                ConfigReader.CrossDomainPolicyFile = Path.Combine(BaseDir, "CrossDomainPolicy.xml");
                ConfigReader.DatabaseName = Path.Combine(BaseDir, "game1.db");


                IncrementProgress();
                Database.OpenDatabase();
                IncrementProgress();


                if (Database.GetUsers().Length <= 0)
                {
                    RegisterForm rfrm = new RegisterForm();
                    if (rfrm.ShowDialog() == DialogResult.Cancel)
                        GameServer.ShutdownServer();

                }

                // Start HI1 Server
                IncrementProgress();

                Entry.SetShutdownCallback(OnShutdown);
                IncrementProgress();

                CrossDomainPolicy.GetPolicy();
                IncrementProgress();

                GameDataJson.ReadGamedata();
                IncrementProgress();

                Map.OpenMap();
                IncrementProgress();

                World.ReadWorldData();
                IncrementProgress();

                Treasure.Init();
                IncrementProgress();

                DroppedItems.Init();
                IncrementProgress();

                WildHorse.Init();
                IncrementProgress();

                Drawingroom.LoadAllDrawingRooms();
                IncrementProgress();

                Brickpoet.LoadPoetryRooms();
                IncrementProgress();

                Multiroom.CreateMultirooms();
                IncrementProgress();

                Auction.LoadAllAuctionRooms();
                IncrementProgress();

                Command.RegisterCommands();
                IncrementProgress();

                Item.DoSpecialCases();
                IncrementProgress();
                try
                {
                    GameServer.StartServer();
                }
                catch (Exception e)
                {
                    MessageBox.Show("Horse Isle server failed to start: " + e.Message, "Error starting web server", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                IncrementProgress();

                lfrm.DialogResult = DialogResult.OK;

                SystemTrayIcon stry = new SystemTrayIcon();
                stry.ShowDialog();

                // Finally, shutdown server
                GameServer.ShutdownServer();
            }


        }
    }
}