namespace View_by_Distance.Shared.Models.Stateless.Methods;

internal abstract class FileSystem
{ // ...

    private static void SetFileSystemCollection(string requestPath, (string RootResultsDirectoryAbsoluteUri, string C_ResizeContentDirectory, string D_FacesContentDirectory, string E_DistanceCollectionDirectory) tuple, bool all, List<Models.FileSystem> results, IEnumerator<string> subDirectoryFiles, List<Models.FaceFileSystem> faceFileSystemCollection)
    {
        Models.Face face;
        Models.FaceFileSystem faceFileSystem;
        face = Face.GetFace(subDirectoryFiles.Current);
        faceFileSystem = new Models.FaceFileSystem(requestPath, tuple.RootResultsDirectoryAbsoluteUri.Length, tuple.C_ResizeContentDirectory, tuple.D_FacesContentDirectory, subDirectoryFiles.Current, face);
        if (!all)
            results.Add(faceFileSystem);
        else
            faceFileSystemCollection.Add(faceFileSystem);
    }

    private static void LoopFileSystemCollection(string requestPath, (string RootResultsDirectoryAbsoluteUri, string C_ResizeContentDirectory, string D_FacesContentDirectory, string E_DistanceCollectionDirectory) tuple, bool all, List<Models.FileSystem> results, IEnumerator<string> subDirectoryFiles, List<Models.FaceFileSystem> faceFileSystemCollection)
    {
        for (int j = 0; j < int.MaxValue; j++)
        {
            SetFileSystemCollection(requestPath, tuple, all, results, subDirectoryFiles, faceFileSystemCollection);
            if (!all || !subDirectoryFiles.MoveNext())
                break;
        }
    }

    private static void SetFileSystemCollection(string[] directories, List<Models.FileSystem> results, int i)
    {
        DirectoryInfo directoryInfo = new(directories[i]);
        Models.FileSystem fileSystem = new DirectoryFileSystem(directoryInfo);
        results.Add(fileSystem);
    }

    private static void LoopFileSystemCollection(string requestPath, (string RootResultsDirectoryAbsoluteUri, string C_ResizeContentDirectory, string D_FacesContentDirectory, string E_DistanceCollectionDirectory) tuple, string[] directories, bool all, List<Models.FileSystem> results, IEnumerator<string> subDirectoryFiles, List<Models.FaceFileSystem> faceFileSystemCollection, int i)
    {
        if (subDirectoryFiles.MoveNext())
            LoopFileSystemCollection(requestPath, tuple, all, results, subDirectoryFiles, faceFileSystemCollection);
        else
            SetFileSystemCollection(directories, results, i);
    }

    internal static List<Models.FileSystem> GetFileSystemCollection(string requestPath, (string RootResultsDirectoryAbsoluteUri, string C_ResizeContentDirectory, string D_FacesContentDirectory, string E_DistanceCollectionDirectory) tuple, string[] directories, string[] files, bool all)
    {
        List<Models.FileSystem> results = [];
        Models.Face face;
        Models.FaceFileSystem faceFileSystem;
        IEnumerator<string> subDirectoryFiles;
        List<Models.FaceFileSystem> faceFileSystemCollection = [];
        for (int i = 0; i < directories.Length; i++)
        {
            subDirectoryFiles = Directory.EnumerateFiles(directories[i], "*.json", SearchOption.TopDirectoryOnly).GetEnumerator();
            LoopFileSystemCollection(requestPath, tuple, directories, all, results, subDirectoryFiles, faceFileSystemCollection, i);
        }
        for (int i = 0; i < files.Length; i++)
        {
            face = Face.GetFace(files[i]);
            faceFileSystem = new Models.FaceFileSystem(requestPath, tuple.RootResultsDirectoryAbsoluteUri.Length, tuple.C_ResizeContentDirectory, tuple.D_FacesContentDirectory, files[i], face);
            results.Add(faceFileSystem);
        }
        if (all)
            results.AddRange(faceFileSystemCollection);
        return results;
    }

}