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 DeleteFiles(IEnumerable<string> filesName);

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

    /// <summary>
    /// Удаление директории
    /// </summary>
    /// <param name="path"></param>
    /// <param name="isRecursive"></param>
    void DeleteDirectory(string path, bool isRecursive);

    /// <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="path1"></param>
    /// <param name="path2"></param>
    /// <param name="path3"></param>
    /// <returns></returns>
    string MakeFilePath(string path1, string path2, string path3);

    /// <summary>
    /// Получение пути к файлу связанного со скважиной
    /// </summary>
    /// <param name="idWell"></param>
    /// <param name="idCategory"></param>
    /// <param name="idFile"></param>
    /// <param name="dotExtenstion"></param>
    /// <returns></returns>
    string GetFilePath(int idWell, int idCategory, int idFile, string dotExtenstion);
    
    /// <summary>
    /// Получение пути файла лежащего на диске
    /// </summary>
    /// <param name="path1"></param>
    /// <param name="path2"></param>
    /// <param name="idFile"></param>
    /// <param name="dotExtenstion"></param>
    /// <returns></returns>
    string GetFilePath(string path1, string path2, int idFile, string dotExtenstion);
}