using System;
using System.Windows.Forms;

namespace CodeImp.DoomBuilder.BuilderModes.Interface
{
	public partial class CurveLinedefsOptionsPanel : UserControl
	{
		#region ================== Event Handlers

		public event EventHandler OnValueChanged;

		#endregion

		#region ================== Variables

		private bool blockevents;
		private bool fixedcurveoutwards;

		#endregion

		#region ================== Properties

		public int Vertices { get { return (int)verts.Value; } set { verts.Value = General.Clamp(value, (int)verts.Minimum, (int)verts.Maximum); } }
		public int Distance { get { return (int)distance.Value; } set { distance.Value = General.Clamp(value, (int)distance.Minimum, (int)distance.Maximum); } }
		public int DistanceIncrement { get { return (int)distance.Increment; } }
		public int Angle { get { return (int)angle.Value; } set { angle.Value = (decimal)General.Clamp(value, (float)angle.Minimum, (float)angle.Maximum); } }
		public int AngleIncrement { get { return (int)angle.Increment; } }
		public int MaximumAngle { get { return (int)angle.Maximum; } }
		public bool FixedCurve { get { return fixedcurve.Checked; } }
		public bool FixedCurveOutwards { get { return fixedcurveoutwards; } }

		#endregion
		
		#region ================== Constructor

		public CurveLinedefsOptionsPanel()
		{
			InitializeComponent();
		}

		#endregion

		#region ================== Mathods

		public void SetValues(int verts, int distance, int angle, bool fixedcurve, bool fixeddirection)
		{
			blockevents = true;

			this.verts.Value = General.Clamp(verts, (int)this.verts.Minimum, (int)this.verts.Maximum);
			this.distance.Value = General.Clamp(distance, (int)this.distance.Minimum, (int)this.distance.Maximum);
			this.angle.Value = General.Clamp(angle, (int)this.angle.Minimum, (int)this.angle.Maximum);
			this.fixedcurve.Checked = fixedcurve;
			this.fixedcurveoutwards = fixeddirection;

			blockevents = false;
		}

		public void Register()
		{
			General.Interface.BeginToolbarUpdate();
			General.Interface.AddButton(vertslabel);
			General.Interface.AddButton(verts);
			General.Interface.AddButton(distancelabel);
			General.Interface.AddButton(distance);
			General.Interface.AddButton(anglelabel);
			General.Interface.AddButton(angle);
			General.Interface.AddButton(flip);
			General.Interface.AddButton(reset);
			General.Interface.AddButton(separator1);
			General.Interface.AddButton(fixedcurve);
			General.Interface.AddButton(separator2);
			General.Interface.AddButton(apply);
			General.Interface.AddButton(cancel);
			General.Interface.EndToolbarUpdate();
		}

		public void Unregister()
		{
			General.Interface.BeginToolbarUpdate();
			General.Interface.RemoveButton(cancel);
			General.Interface.RemoveButton(apply);
			General.Interface.RemoveButton(anglelabel);
			General.Interface.RemoveButton(separator2);
			General.Interface.RemoveButton(fixedcurve);
			General.Interface.RemoveButton(separator1);
			General.Interface.RemoveButton(reset);
			General.Interface.RemoveButton(flip);
			General.Interface.RemoveButton(angle);
			General.Interface.RemoveButton(anglelabel);
			General.Interface.RemoveButton(distance);
			General.Interface.RemoveButton(distancelabel);
			General.Interface.RemoveButton(verts);
			General.Interface.RemoveButton(vertslabel);
			General.Interface.EndToolbarUpdate();
		}

		#endregion

		#region ================== Events

		private void apply_Click(object sender, EventArgs e)
		{
			// Apply now
			General.Editing.AcceptMode();
		}

		private void cancel_Click(object sender, EventArgs e)
		{
			// Cancel now
			General.Editing.CancelMode();
		}

		private void OnUIValuesChanged(object sender, EventArgs e)
		{
			if(!blockevents && OnValueChanged != null) OnValueChanged(this, EventArgs.Empty);
		}

		private void fixedcurve_CheckedChanged(object sender, EventArgs e)
		{
			// Enable/disable controls
			distance.Enabled = !fixedcurve.Checked;
			distancelabel.Enabled = !fixedcurve.Checked;

			if(!blockevents && OnValueChanged != null) OnValueChanged(this, EventArgs.Empty);
		}

		private void flip_Click(object sender, EventArgs e)
		{
			if (fixedcurve.Checked)
			{
				fixedcurveoutwards = !fixedcurveoutwards;
				OnValueChanged(this, EventArgs.Empty);
			}
			else
				distance.Value = -distance.Value;
			
		}

		private void reset_Click(object sender, EventArgs e)
		{
			SetValues(CurveLinedefsMode.DEFAULT_VERTICES_COUNT, CurveLinedefsMode.DEFAULT_DISTANCE, CurveLinedefsMode.DEFAULT_ANGLE, false, true);
			if(OnValueChanged != null) OnValueChanged(this, EventArgs.Empty);
		}

		#endregion

	}
}
