using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Mesen.GUI.Controls
{
	class MyListView : ListView
	{
		private bool _preventCheck = false;

		public MyListView()
		{
			this.DoubleBuffered = true;
		}

		protected override void OnItemCheck(ItemCheckEventArgs e)
		{
			if(this._preventCheck) {
				e.NewValue = e.CurrentValue;
				this._preventCheck = false;
			} else
				base.OnItemCheck(e);
		}

		protected override void OnMouseDown(MouseEventArgs e)
		{
			if(e.Button == MouseButtons.Left && e.Clicks > 1) {
				this._preventCheck = true;
			} else {
				this._preventCheck = false;
			}
			base.OnMouseDown(e);
		}

		protected override void OnKeyDown(KeyEventArgs e)
		{
			this._preventCheck = false;
			base.OnKeyDown(e);
		}
	}

	class WatchList : MyListView
	{
		private int _editItemIndex = -1;
		private string _originalText = null;
		private bool _pressedEsc = false;

		public event LabelEditEventHandler AfterEdit;

		public WatchList()
		{
			this.DoubleBuffered = true;
		}

		public bool IsEditing
		{
			get { return _editItemIndex >= 0; }
		}

		protected override void OnBeforeLabelEdit(LabelEditEventArgs e)
		{
			if(_originalText == null) {
				_originalText = this.Items[e.Item].Text;
			}
			_editItemIndex = e.Item;
			base.OnBeforeLabelEdit(e);
		}

		protected override void OnAfterLabelEdit(LabelEditEventArgs e)
		{
			base.OnAfterLabelEdit(e);
			string text = e.Label;
			var item = this.Items[e.Item];
			if(_pressedEsc) {
				text = _originalText;
				item = new ListViewItem(_originalText);
				this.Items.Insert(e.Item, item);
				_pressedEsc = false;
			}
			_originalText = null;
			_editItemIndex = -1;
			AfterEdit?.Invoke(this, new LabelEditEventArgs(item.Index, text));
		}
		
		protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
		{
			if(_editItemIndex >= 0 && keyData == Keys.Escape) {
				_pressedEsc = true;
			}
			return base.ProcessCmdKey(ref msg, keyData);
		}

		protected override void OnKeyPress(KeyPressEventArgs e)
		{
			if(this.LabelEdit && _editItemIndex < 0 && this.SelectedItems.Count > 0) {
				if(e.KeyChar >= 32 && e.KeyChar <= 127) {
					_originalText = this.SelectedItems[0].Text;
					this.SelectedItems[0].Text = e.KeyChar.ToString();
					this.SelectedItems[0].BeginEdit();
					SendKeys.Send("{RIGHT}");
				}
			}

			base.OnKeyPress(e);
		}
	}

	public class DoubleBufferedListView : ListView
	{
		public DoubleBufferedListView()
		{
			this.DoubleBuffered = true;
		}
	}
}