using System;
using System.Collections.Generic;
using System.Linq;
using InABox.Clients;
using InABox.Core;

namespace InABox.DynamicGrid
{
    public class FormControlGrid<T> : DynamicGrid<T> where T : DFLayoutControl, new()
    {
        public FormControlGrid()
        {
            Items = new List<T>();
            Options.AddRange(DynamicGridOption.RecordCount);
        }

        public List<T> Items { get; set; }

        protected override void DeleteItems(params CoreRow[] rows)
        {
            var items = new List<DFLayoutControl>();
            foreach (var row in rows)
                items.Add(Items[row.Index]);
            Items.RemoveAll(x => items.Contains(x));
        }

        protected override T LoadItem(CoreRow row)
        {
            return Items[row.Index];
        }

        protected override void Reload(Filters<T> criteria, Columns<T> columns, ref SortOrder<T>? sort, Action<CoreTable?, Exception?> action)
        {
            var table = new CoreTable();
            table.LoadColumns(typeof(T));
            table.LoadRows(Items.OrderBy(x => x.Sequence));
            action?.Invoke(table, null);
        }

        public override void SaveItem(T item)
        {
            if (!Items.Contains(item))
                Items.Add(item);
        }

        protected override Document LoadDocument(Guid id)
        {
            Document? doc = null;
            if (id != Guid.Empty)
                doc = new Client<Document>().Load(new Filter<Document>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
            return doc ?? new Document();
        }

        protected override Document FindDocument(string filename)
        {
            return new Client<Document>().Load(new Filter<Document>(x => x.FileName).IsEqualTo(filename)).FirstOrDefault();
        }

        protected override void SaveDocument(Document document)
        {
            new Client<Document>().Save(document, "");
        }
    }
}