using MercatorPenguin;
using MercatorPenguin.EditCustomizers;
using MercatorExtensions;

namespace TestPenguinCustomizerPicking
{
	public class CustomizerPicking : BaseEditPickingCustomizer
	{
		public CustomizerPicking(ConstructorParams constructorParams) :
			base(constructorParams)
		{ }

		public override async Task OnBeforeDeleteLineAsync(BeforeDeleteLineEventArgs e)
		{
			if (!await Dialogs.AnswerYesNo(Page, $"Wilt u deze lijn {e.Ligne["id_article"]} op deze picking echt verwijderen?"))
			{
				e.CancelDeleteLine = true;
			}
		}

		public override async void OnAfterDeleteLine(AfterDeleteLineEventArgs e)
		{
			await Dialogs.Stop(Page, $"De lijn werd succesvol verwijderd!");
		}

		public override async Task OnBeforeChangeLineAsync(BeforeChangeLineEventArgs e)
		{
			if (!await Dialogs.AnswerYesNo(Page, $"Wilt u de kolom {e.ColumnToChange} van deze lijn {e.Line["id_article"]} echt wijzigen met deze nieuwe waarde {e.NewValue}?"))
			{
				e.CancelChangeLine = true;
			}
		}

		public override async Task OnAfterChangeLineAsync(AfterChangeLineEventArgs e)
		{
			await Dialogs.Stop(Page, $"Deze lijn {e.Line["id_article"]} heeft zojuist deze kolom {e.ColumnToChange} gewijzigd van deze waarde {e.OldValue} naar {e.Line[e.ColumnToChange]}?");
		}

		public override async Task OnAfterInsertItemAsync(AfterInsertItemEventArgs e)
		{
			var editEntryBehavior = Controls.OfType<IEditPickingBehavior>().FirstOrDefault();
			if (editEntryBehavior == null)
				return;

			var editEntry = Controls.OfType<IEditEntry>().FirstOrDefault(c => c.Source?.Equals(editEntryBehavior.OutOfDocReasonSource, StringComparison.InvariantCultureIgnoreCase) ?? false);
			if (editEntry.Text == "Vervangingsartikel")
			{
				List<ItemString> items = new List<ItemString>();
				foreach (var d in Lignes.DataTable.RowsEnumerable(r => r.Value<double>("Q_ORI").CompareTo(0, 2) != 0))
					items.Add(new ItemString() { Id = d["id_article"].ToString(), Lib = d["designatio"].ToString() });
				var ret = await Dialogs.AskList(Page, "Vervangt welk artikel?", items);
				if (ret != null)
				{
					editEntry.Text = editEntry.Text + $" voor het artikel : {ret.Lib}({ret.Id})";
				}
			}
		}

		public override async Task OnBeforeSaveAsync(BeforeSaveEventArgs e)
		{
			if (!await Dialogs.AnswerYesNo(Page, "Wilt u de wijzigingen op deze picking echt opslaan?"))
			{
				e.CancelSave = true;
			}
		}

		public override async Task OnAfterSaveAsync(AfterSaveEventArgs e)
		{
			await Dialogs.Stop(Page, "De picking werd succesvol opgeslagen!");
		}
    }
	public class ItemString
	{
		public string Id { get; set; }
		public string Lib { get; set; }

		public override string ToString()
		{
			return Lib;
		}
	}
}