using System.Xml;

namespace Kit.Helpers.Repository.Xml
{
    public interface IPersistentXmlKey<TKey>
    {
        string ElementName { get; set; }
        TKey PersistentXmlRootKey { get; }
    }

    public interface ISelectXmlRepository<TEntity, TFilter>
    {
        IEnumerable<TEntity> Select(XmlDocument db, TFilter filter);
        /// <summary> Получить количество xml узлов, подходящих под фильтр. Облегчённый аналог <see cref="Select(XmlDocument, TFilter)"/>.Count() </summary>
        int Count(XmlDocument db, TFilter filter);
        IEnumerable<TEntity> Select(XmlDocument db, TFilter filter, int page, int sizepage);
    }

    public interface ISelectPageXmlRepository<TEntity, TFilter, TContextKey>
    {
        IEnumerable<TEntity> Select(XmlDocument db, TFilter filter);
        IEnumerable<TEntity> Select(XmlNode node, TFilter filter);
        /// <summary> Получить количество xml узлов, подходящих под фильтр. Облегчённый аналог <see cref="Select(XmlDocument, TFilter)"/>.Count() </summary>
        int Count(XmlDocument db, TFilter filter);
        IEnumerableWithPage<TEntity> SelectPage(XmlDocument db, TFilter filter, int pageNo, int pageSize);
    }

    public interface IPersistentXml2Repository<TEntity, TKey, TFilter, TContextKey> : ISelectPageXmlRepository<TEntity, TFilter, TContextKey>
    {
        TEntity Get(XmlDocument db, TKey key);
        TEntity Get(XmlDocument db, TKey key, TFilter filter);
        bool Exists(XmlDocument db, TKey key);
        IEnumerable<ItemLog> Update(XmlDocument db, TEntity entity);
        TKey InsertToNode(XmlNode db, TEntity entity);
        TKey Insert(XmlDocument db, TEntity entity);
        void Delete(XmlDocument db, TKey key);
        // IEnumerable<TEntity> Get(IEnumerable<TKey> keys);
    }


    public interface IPersistentXmlRepository<TEntity, TKey, TFilter, TContextKey> : ISelectXmlRepository<TEntity, TFilter>
    {
        TEntity Get(XmlDocument db, TKey key);
        TKey Insert(XmlNode db, TEntity entity);
        // IEnumerable<TEntity> Get(IEnumerable<TKey> keys);
    }

    public interface IPersistentXmlRepository<TEntity, TKey, TFilter> : IPersistentXmlRepository<TEntity, TKey, TFilter, int>
    {
    }

    public interface IPersistentXmlRepository<TEntity, TFilter> : IPersistentXmlRepository<TEntity, int, TFilter, int>
    {
    }
}
