namespace ProjectFighterJet.CollectionGenericObjects;

public interface ICollectionGenericObjects<T>
where T : class
{
    /// <summary>
    /// Количество объектов в коллекции
    /// </summary>
    int Count { get; }

    /// <summary>
    /// Установка максимального количества элементов
    /// </summary>
    int MaxCount { set; get; }

    /// <summary>
    /// Добавление объекта в коллекцию
    /// </summary>
    /// <param name="obj">Добавляемый объект</param>
    /// <param name="comparer">Cравнение двух объектов</param>
    /// <returns>true - вставка прошла удачно, false - вставка не удалась</returns>
    int Insert(T obj, IEqualityComparer<T?>? comparer = null);

    /// <summary>
    /// Добавление объекта в коллекцию на конкретную позицию
    /// </summary>
    /// <param name="obj">Добавляемый объект</param>
    /// <param name="position">Позиция</param>
    /// <param name="comparer">Cравнение двух объектов</param>
    /// <returns>true - вставка прошла удачно, false - вставка не удалась</returns>
    int Insert(T obj, int position, IEqualityComparer<T?>? comparer = null);

    /// <summary>
    /// Удаление объекта из коллекции с конкретной позиции
    /// </summary>
    /// <param name="position">Позиция</param>
    /// <returns>true - удаление прошло удачно, false - удаление не удалось</returns>
    T? Remove(int position);

    /// <summary>
    /// Получение объекта по позиции
    /// </summary>
    /// <param name="position">Позиция</param>
    /// <returns>Объект</returns>
    T? Get(int position);
    /// <summary>
    /// Получение типа коллекции
    /// </summary>
    CollectionType GetCollectionType { get; }
    /// <summary>
    /// Получение объектов коллекции по одному
    /// </summary>
    /// <returns>Поэлементый вывод элементов коллекции</returns>
    IEnumerable<T?> GetItems();
    /// <summary>
    /// Сортировка коллекции
    /// </summary>
    /// <param name="comparer">Сравнитель объектов</param>
    void CollectionSort(IComparer<T?> comparer);
}