using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace AsbCloudApp.Services
{
    /// <summary>
    /// Сервис получения, добавления, изменения, удаления данных
    /// </summary>
    /// <typeparam name="TDto"></typeparam>
    public interface ICrudRepository<TDto>
        where TDto : Data.IId
    {
        /// <summary>
        /// Код возврата ошибки: Id не найден в БД.
        /// </summary>
        public const int ErrorIdNotFound = -1;

        /// <summary>
        /// Получение всех записей
        /// </summary>
        /// <param name="token"></param>
        /// <returns>emptyList if nothing found</returns>
        Task<IEnumerable<TDto>> GetAllAsync(CancellationToken token);

        /// <summary>
        /// Получить запись по id
        /// </summary>
        /// <param name="id"></param>
        /// <param name="token"></param>
        /// <returns>null if not found</returns>
        Task<TDto?> GetOrDefaultAsync(int id, CancellationToken token);


        /// <summary>
        /// Получить запись по id
        /// </summary>
        /// <param name="id"></param>
        /// <returns>null if not found</returns>
        TDto? GetOrDefault(int id);

        /// <summary>
        /// Добавление новой записи
        /// </summary>
        /// <param name="newItem"></param>
        /// <param name="token"></param>
        /// <returns>Id новой записи</returns>
        Task<int> InsertAsync(TDto newItem, CancellationToken token);

        /// <summary>
        /// Добавление нескольких записей
        /// </summary>
        /// <param name="newItems"></param>
        /// <param name="token"></param>
        /// <returns>количество добавленных</returns>
        Task<int> InsertRangeAsync(IEnumerable<TDto> newItems, CancellationToken token);

        /// <summary>
        /// Отредактировать запись
        /// </summary>
        /// <param name="item"></param>
        /// <param name="token"></param>
        /// <returns>если больше 0 - Id записи, если меньше 0 - код ошибки</returns>
        Task<int> UpdateAsync(TDto item, CancellationToken token);

        /// <summary>
        /// Удалить запись
        /// </summary>
        /// <param name="id"></param>
        /// <param name="token"></param>
        /// <returns>количество добавленных, если меньше 0 - код ошибки</returns>
        Task<int> DeleteAsync(int id, CancellationToken token);
    }
}