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

namespace AsbCloudApp.Repositories
{
    /// <summary>
    /// Репозиторий хранения фалов
    /// </summary>
    public interface IFileStorageRepository
    {
        /// <summary>
        /// Получение длинны фала и проверка его наличия, если отсутствует падает исключение
        /// </summary>
        /// <param name="srcFilePath"></param>
        /// <returns></returns>
        long GetFileLength(string srcFilePath);

        /// <summary>
        /// Перемещение файла
        /// </summary>
        /// <param name="srcFilePath"></param>
        /// <param name="filePath"></param>
        void MoveFile(string srcFilePath, string filePath);

        /// <summary>
        /// Копирование файла
        /// </summary>
        /// <param name="filePathRec"></param>
        /// <param name="fileStreamSrc"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task SaveFileAsync(string filePathRec, Stream fileStreamSrc, CancellationToken token);

        /// <summary>
        /// Удаление файла
        /// </summary>
        /// <param name="filesName"></param>
        void DeleteFile(IEnumerable<string> filesName);

        /// <summary>
        /// Удаление всех файлов с диска о которых нет информации в базе
        /// </summary>
        /// <param name="idWell"></param>
        /// <param name="idsFiles"></param>
        int DeleteFilesNotInList(int idWell, IEnumerable<int> idsFiles);

        /// <summary>
        /// Вывод списка всех файлов из базы, для которых нет файла на диске
        /// </summary>
        /// <param name="files"></param>
        /// <returns></returns>
        IEnumerable<FileInfoDto> GetListFilesNotDisc(IEnumerable<FileInfoDto> files);

        /// <summary>
        /// Получение пути к файлу
        /// </summary>
        /// <param name="idWell"></param>
        /// <param name="idCategory"></param>
        /// <param name="fileFullName"></param>
        /// <param name="fileId"></param>
        /// <returns></returns>
        string MakeFilePath(int idWell, int idCategory, string fileFullName, int fileId);

        /// <summary>
        /// Получить путь для скачивания
        /// </summary>
        /// <param name="idWell"></param>
        /// <param name="idCategory"></param>
        /// <param name="idFile"></param>
        /// <param name="dotExtention"></param>
        /// <returns></returns>
        string GetUrl(int idWell, int idCategory, int idFile, string dotExtention);
    }
}