using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WorldOfPeacecraft
{
	class Gui : Form, IGui
	{
		private const int ChatWidth = 300;
		private const int OnlinePlayerWidth = 100;
		private IBackend Backend;

		private MapPanel MapPanel;
		private ChatPanel ChatPanel;
		private OnlinePlayerList OnlinePlayerList;

		public Gui ()
		{
			//AllocConsole();
		}

		public void SetBackend (IBackend backend)
		{
			Backend = backend;
		}

		public void FocusMap ()
		{
			MapPanel.Focus();
		}

		protected override void OnLoad (EventArgs e)
		{
			base.OnLoad (e);
			InitializeComponents ();
			Backend.StartThreads ();
		}

		public void InitializeComponents ()
		{
			ChatPanel = new ChatPanel (Backend);
			MapPanel = new MapPanel (Backend);
			OnlinePlayerList = new OnlinePlayerList (Backend);
			this.SuspendLayout();
			this.Size = new Size(OnlinePlayerWidth + 400 + ChatWidth, 400);
			OnlinePlayerList.Location = new Point(0,0);
			OnlinePlayerList.Size = new Size(OnlinePlayerWidth, 400);
			MapPanel.Location = new Point(OnlinePlayerWidth,0);
			MapPanel.Size = new Size(400, 400);
			ChatPanel.Location = new Point (OnlinePlayerWidth + 400, 0);
			ChatPanel.Size = new Size (300, 400);
			this.DoubleBuffered = true;
			this.MaximizeBox = false;
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
			this.Text = "World of Peacecraft";
            this.ShowIcon = false;

			this.Controls.Add (OnlinePlayerList);
			this.Controls.Add (MapPanel);
			this.Controls.Add (ChatPanel);

			this.ResumeLayout();
		}

		protected override void OnClosing (System.ComponentModel.CancelEventArgs e)
		{
			base.OnClosing (e);
			Backend.Stop ();
		}

		public void PerformRefresh ()
		{
			this.BeginInvoke(new MethodInvoker(delegate
			{
				MapPanel.PerformLayout ();
				this.SuspendLayout();
				this.SetClientSizeCore(OnlinePlayerWidth + MapPanel.Width + ChatWidth, MapPanel.Height);
				OnlinePlayerList.Size = new Size(OnlinePlayerWidth, MapPanel.Height);
				MapPanel.Location = new Point(OnlinePlayerWidth, 0);
				ChatPanel.Location = new Point (OnlinePlayerWidth + MapPanel.Width, 0);
				ChatPanel.Size = new Size (ChatWidth, MapPanel.Height);
				this.ResumeLayout();
				ChatPanel.UpdateData ();
				this.Refresh();
			}));
		}

		[DllImport("kernel32.dll", SetLastError = true)]
		[return: MarshalAs(UnmanagedType.Bool)]
		static extern bool AllocConsole();
	}
}
