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

namespace AsbCloudApp.Repositories
{
    /// <summary>
    /// CRUD для работы с плановой траекторией из клиента
    /// </summary>
    /// <returns></returns>
    public interface IPlannedTrajectoryRepository : ITrajectoryRepository
    {
        /// <summary>
        /// Получить все добавленные по скважине координаты плановой траектории
        /// </summary>
        /// <param name="idWell"></param>        
        /// <param name="token"></param>
        /// <returns></returns>
        Task<IEnumerable<PlannedTrajectoryDto>> GetAsync(int idWell, CancellationToken token);

        /// <summary>
        /// Добавить строки с координатами по одной скважине. Если в коллекции координаты для разных скважин получаем exception.
        /// </summary>        
        /// <param name="plannedTrajectoryRows"></param>
        /// <param name="token"></param>
        /// <returns>количество записанных строк или exception с описанием</returns>
        Task<int> AddRangeAsync(IEnumerable<PlannedTrajectoryDto> plannedTrajectoryRows, CancellationToken token);

        /// <summary>
        /// Добавить одну строку с координатами
        /// </summary>        
        /// <param name="plannedTrajectoryRow"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<int> AddAsync(PlannedTrajectoryDto plannedTrajectoryRow, CancellationToken token);

        /// <summary>
        /// Обновить строку с координатами
        /// </summary>
        /// <param name="row"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<int> UpdateAsync(PlannedTrajectoryDto row,
            CancellationToken token);

        /// <summary>
        /// Удалить строки с координатами
        /// </summary>
        /// <param name="ids"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<int> DeleteRangeAsync(IEnumerable<int> ids, CancellationToken token);

        /// <summary>
        /// Удалить всю плановую траекторию по ИД скважины
        /// </summary>
        /// <param name="idWell"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<int> DeleteByIdWellAsync(int idWell, CancellationToken token);
    }
}