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, $"Voulez-vous vraiment supprimer cette ligne {e.Ligne["id_article"]} sur ce picking ?"))
			{
				e.CancelDeleteLine = true;
			}
		}

		public override async void OnAfterDeleteLine(AfterDeleteLineEventArgs e)
		{
			await Dialogs.Stop(Page, $"La ligne a été sumprimée avec succès !");
		}

		public override async Task OnBeforeChangeLineAsync(BeforeChangeLineEventArgs e)
		{
			if (!await Dialogs.AnswerYesNo(Page, $"Voulez-vous vraiment modifier la colonne {e.ColumnToChange} de cette ligne {e.Line["id_article"]} avec cette nouvelle valeur {e.NewValue} ?"))
			{
				e.CancelChangeLine = true;
			}
		}

		public override async Task OnAfterChangeLineAsync(AfterChangeLineEventArgs e)
		{
			await Dialogs.Stop(Page, $"Cette ligne {e.Line["id_article"]} vient de modifier cette colonne {e.ColumnToChange} depuis cette valeur {e.OldValue} vers {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 == "Article de remplacement")
			{
				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, "Remplace quel article ?", items);
				if (ret != null)
				{
					editEntry.Text = editEntry.Text + $" pour l'article : {ret.Lib}({ret.Id})";
				}
			}
		}

		public override async Task OnBeforeSaveAsync(BeforeSaveEventArgs e)
		{
			if (!await Dialogs.AnswerYesNo(Page, "Voulez-vous vraiment enregistrer les modifications sur ce picking ?"))
			{
				e.CancelSave = true;
			}
		}

		public override async Task OnAfterSaveAsync(AfterSaveEventArgs e)
		{
			await Dialogs.Stop(Page, "Le picking a été enregistrée avec succès !");
		}
    }
	public class ItemString
	{
		public string Id { get; set; }
		public string Lib { get; set; }

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