using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows;
using InABox.Core;
using InABox.Wpf;
using Syncfusion.UI.Xaml.Grid;

namespace InABox.DynamicGrid
{
    /*
    /// <summary>
    ///     Interaction logic for DynamicMultiEditWindow.xaml
    /// </summary>
    public partial class DynamicMultiEditWindow : ThemableWindow, IDynamicEditorForm
    {
        public DynamicMultiEditWindow()
        {
            InitializeComponent();
        }

        protected virtual void EndEdit(int row, int col, object value)
        {
        }

        protected virtual void DeleteRow(int row)
        {
        }

        private void Editor_CurrentCellEndEdit(object sender, CurrentCellEndEditEventArgs e)
        {
            //if (!(Editor.CurrentCellInfo.Column is GridComboBoxColumn))
            //    EndEdit(e.RowColumnIndex.RowIndex-1, e.RowColumnIndex.ColumnIndex, null);
        }

        private void OK_Click(object sender, RoutedEventArgs e)
        {
            DialogResult = true;
            Close();
        }

        private void Cancel_Click(object sender, RoutedEventArgs e)
        {
            DialogResult = false;
            Close();
        }


        private void CurrentCellActivated(object sender, CurrentCellActivatedEventArgs args)
        {
            //Skip the selection when it is moved to next row on adding new row.        
            //bool needToMove = (Editor.IsAddNewIndex(args.PreviousRowColumnIndex.RowIndex)
            //     //&& !Editor.IsAddNewIndex(args.CurrentRowColumnIndex.RowIndex)
            //     && (args.ActivationTrigger == ActivationTrigger.Keyboard)
            //     && (Keyboard.IsKeyDown(Key.Enter) || Keyboard.IsKeyDown(Key.Tab)));
            //if (needToMove)
            //{
            //    Dispatcher.BeginInvoke(
            //        new Action(
            //            () =>
            //            {
            //                Editor.MoveCurrentCell
            //                (
            //                    new Syncfusion.UI.Xaml.ScrollAxis.RowColumnIndex
            //                    (
            //                        args.PreviousRowColumnIndex.RowIndex-1,
            //                        args.CurrentRowColumnIndex.ColumnIndex
            //                    )
            //                );
            //            }
            //        )
            //    );
            //}
        }

        private void Delete_Click(object sender, RoutedEventArgs e)
        {
            DeleteRow(Editor.CurrentCellInfo.RowIndex);
        }

        private void Editor_CurrentCellValueChanged(object sender, CurrentCellValueChangedEventArgs e)
        {
            //EndEdit(e.RowColumnIndex.RowIndex - 1, e.RowColumnIndex.ColumnIndex);
        }

        private void Editor_CurrentCellDropDownSelectionChanged(object sender, CurrentCellDropDownSelectionChangedEventArgs e)
        {
            //EndEdit(e.RowColumnIndex.RowIndex - 1, e.RowColumnIndex.ColumnIndex, (e.SelectedItem as DataRowView)["ID"]);
        }
    }*/

    /*public class DynamicEditWindow<T> : DynamicMultiEditWindow where T : BaseObject, new()
    {
        private CoreTable _data;

        private readonly DataTable table = new();

        private readonly Dictionary<int, T> updates = new();

        public T[] Updates => updates.Values.ToArray();

        public event OnCustomiseColumns? OnCustomiseColumns;
        public event OnGetEditor? OnGetEditor;
        public event OnCreateItem<T>? OnCreateItem;
        public event OnGetEditorSequence? OnGetSequence;

        private decimal GetSequence(DynamicGridColumn column)
        {
            if (OnGetSequence != null)
                return OnGetSequence.Invoke(column);
            return 999M;
        }

        public void Load(CoreTable data)
        {
            _data = data;

            var dgcs = OnCustomiseColumns?.Invoke(this, null).OrderBy(x => GetSequence(x)).ToArray();

            foreach (var dgc in dgcs)
            {
                var col = data.Columns.FirstOrDefault(x => string.Equals(x.ColumnName, dgc.ColumnName));
                if (col != null)
                    table.Columns.Add(col.ColumnName, col.DataType);
            }

            foreach (var row in data.Rows)
            {
                var newrow = table.NewRow();
                foreach (var col in dgcs)
                    if (table.Columns.Contains(col.ColumnName))
                        newrow[col.ColumnName] = row[col.ColumnName];
                table.Rows.Add(newrow);
            }


            foreach (var dgc in dgcs)
                try
                {
                    var editor = OnGetEditor?.Invoke(dgc);

                    if (editor != null && editor.Editable != Editable.Hidden)
                    {
                        GridColumn col = null;

                        if (editor is TextBoxEditor)
                        {
                            col = new GridTextColumn { ColumnSizer = GridLengthUnitType.Star };
                        }

                        else if (editor is CodeEditor)
                        {
                            col = new GridMaskColumn { Mask = ">a" };
                        }

                        else if (editor is CheckBoxEditor)
                        {
                            col = new GridCheckBoxColumn();
                        }

                        else if (editor is DateTimeEditor)
                        {
                            col = new GridDateTimeColumn();
                        }

                        else if (editor is DateEditor)
                        {
                            col = new GridDateTimeColumn();
                        }

                        else if (editor is TimeOfDayEditor)
                        {
                            col = new GridTimeSpanColumn();
                        }

                        else if (editor is DurationEditor)
                        {
                            col = new GridTimeSpanColumn();
                        }

                        else if (editor is PINEditor)
                        {
                            col = new GridMaskColumn { Mask = "9999" };
                        }

                        //    //else if (editor is CheckListEditor)
                        //    //    element = new CheckListBoxEditorControl();
                        //    //else if (editor is MemoEditor)
                        //    //    element = new MemoEditorControl();
                        else if (editor is LookupEditor || editor is EnumLookupEditor || editor is ComboLookupEditor)
                        {
                            var values = (editor as ILookupEditor)?.Values(dgc.ColumnName)?.ToDataTable()?.AsDataView();
                            col = new GridComboBoxColumn { DisplayMemberPath = "Display", SelectedValuePath = "ID", ItemsSource = values };
                        }

                        //    //else if (editor is MiscellaneousDocumentEditor)
                        //    //    element = new DocumentEditorControl();
                        //    //else if (editor is ImageDocumentEditor)
                        //    //    element = new DocumentEditorControl();
                        //    //else if (editor is PDFDocumentEditor)
                        //    //    element = new DocumentEditorControl();
                        else if (editor is CurrencyEditor)
                        {
                            col = new GridCurrencyColumn();
                        }

                        else if (editor is DoubleEditor)
                        {
                            col = new GridNumericColumn { ParsingMode = ParseMode.Double };
                        }

                        else if (editor is IntegerEditor)
                        {
                            col = new GridNumericColumn { ParsingMode = ParseMode.Int };
                        }


                        //else if (editor is InABox.Core.ScriptEditor)
                        //    element = new ScriptEditorControl();
                        //else if (editor is PopupEditor)
                        //    element = new PopupEditorControl();
                        //else if (editor is TimestampEditor)
                        //    element = new TimestampEditorControl();
                        //else if (editor is ColorEditor)
                        //    element = new ColorEditorControl();
                        if (col != null)
                        {
                            col.MappingName = dgc.ColumnName;
                            col.UseBindingValue = true;
                            Editor.Columns.Add(col);
                        }
                    }
                }
                catch (Exception e)
                {
                    Logger.Send(LogType.Error, "", string.Format("*** Unknown Error: {0}\n{1}", e.Message, e.StackTrace));
                }
        }

        protected override void EndEdit(int row, int col, object value)
        {
            if (!updates.ContainsKey(row))
            {
                if (row < _data.Rows.Count)
                    updates[row] = _data.Rows[row].ToObject<T>();
                else
                    updates[row] = OnCreateItem?.Invoke();
            }

            object cur = updates[row];
            var property = Editor.Columns[col].MappingName;

            var currow = Editor.View.IsAddingNew
                ? (Editor.View.CurrentAddItem as DataRowView).Row
                : table.Rows[row];
            var val = value == null ? currow[property] : value;
            currow[property] = val;
            CoreUtils.SetPropertyValue(cur, property, val);
        }

        protected override void OnActivated(EventArgs e)
        {
            base.OnActivated(e);
            Editor.ItemsSource = table;
        }

        protected override void DeleteRow(int row)
        {
            if (Editor.IsAddNewIndex(row))
                Editor.View.CancelNew();
            else if (row < table.Rows.Count)
                table.Rows.RemoveAt(row);
        }
    }*/
}