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

namespace WorldOfPeacecraft
{
	public class Gui : Form, IGui
	{
		private const int ChatWidth = 300;
		private const int OnlinePlayerWidth = 150;
		private IBackend Backend;
		public Form MainForm { get; set; }

		private MapPanel MapPanel;
		private ChatPanel ChatPanel;
		private OnlinePlayerList OnlinePlayerList;
		private bool loaded = false;

		//private Music m = new Music();

		public Gui ()
		{
		}

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

		public void CallComponentConstructors()
		{
			ChatPanel = new ChatPanel (Backend);
			MapPanel = new MapPanel (Backend);
			OnlinePlayerList = new OnlinePlayerList (Backend);
		}

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

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

		protected override void OnPaint (PaintEventArgs e)
		{
			lock (Backend) {
				base.OnPaint(e);
			}
		}

		public void InitializeComponents ()
		{
			MapPanel.InitializeComponents ();
			ChatPanel.InitializeComponents ();
			OnlinePlayerList.InitializeComponents ();
			this.SuspendLayout();
			this.Size = new Size(OnlinePlayerWidth + 400 + ChatWidth, 400);
			OnlinePlayerList.Location = new Point(0,0);
			MapPanel.Location = new Point(OnlinePlayerWidth,0);
			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();
			loaded = true;
			this.PerformRefresh();
			this.CenterToScreen ();

			//m.Playmusic ("overworld");
		}

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

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

		public void LoadResources(){
			MapPanel.LoadResources ();
			OnlinePlayerList.LoadResources ();
		}
	}
}
