using System.Text.Json; using View_by_Distance.Instance.Models.Stateless; using View_by_Distance.Metadata.Models; using View_by_Distance.Resize.Models; using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models.Methods; using View_by_Distance.Shared.Models.Stateless; namespace View_by_Distance.Instance.Models; /// // N/A /// internal class E2_Navigate { private readonly string _ArgZero; private readonly E3_Rename _Rename; private readonly IConsole _Console; private readonly Serilog.ILogger? _Log; private readonly Configuration _Configuration; internal E2_Navigate(IConsole console, Configuration configuration, string argZero) { _Console = console; _ArgZero = argZero; _Configuration = configuration; _Rename = new E3_Rename(configuration); _Log = Serilog.Log.ForContext(); } public override string ToString() { string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); return result; } private void DisplayTags(Property.Models.Configuration configuration, Model model, PredictorModel predictorModel, string outputResolution, string[] directories, Dictionary directoryKeyValuePairs, string[] files, Dictionary fileKeyValuePairs) { if (_Log is null) throw new Exception($"{nameof(_Log)} is null!"); bool all = false; FileSystem fileSystem; string requestPath = "/RootResultsDirectory"; string? rootResultsDirectory = Path.GetDirectoryName(Property.Models.Stateless.IResult.GetResultsGroupDirectory(configuration, nameof(B_Metadata))); if (string.IsNullOrEmpty(rootResultsDirectory)) throw new Exception(); string modelName = model.ToString(); string predictorModelName = predictorModel.ToString(); string rootResultsDirectoryAbsoluteUri = new Uri(rootResultsDirectory).AbsoluteUri; string dFacesContentDirectory = Path.Combine(Property.Models.Stateless.IResult.GetResultsFullGroupDirectory(configuration, modelName, predictorModelName, nameof(D_Face), outputResolution, includeResizeGroup: true, includeModel: true, includePredictorModel: true), "()"); string cResizeContentDirectory = Path.Combine(Property.Models.Stateless.IResult.GetResultsFullGroupDirectory(configuration, modelName, predictorModelName, nameof(C_Resize), outputResolution, includeResizeGroup: true, includeModel: false, includePredictorModel: false), "()"); string eDistanceCollectionDirectory = Path.Combine(Property.Models.Stateless.IResult.GetResultsFullGroupDirectory(configuration, modelName, predictorModelName, nameof(E_Distance), outputResolution, includeResizeGroup: true, includeModel: true, includePredictorModel: true), "[]"); (string RootResultsDirectoryAbsoluteUri, string C_ResizeContentDirectory, string D_FacesContentDirectory, string E_DistanceCollectionDirectory) tuple = new(rootResultsDirectoryAbsoluteUri, cResizeContentDirectory, dFacesContentDirectory, eDistanceCollectionDirectory); List fileSystemCollection = Shared.Models.Stateless.Methods.IFileSystem.GetFileSystemCollection(requestPath, tuple, directories, files, all); Queue queue = new(fileSystemCollection); foreach (KeyValuePair element in directoryKeyValuePairs) { fileSystem = queue.Dequeue(); _Log.Warn(string.Concat(element.Key, " - D) ", " <", fileSystem.Display, ">")); // _Log.Info(string.Join(Environment.NewLine, from l in fileSystem where !string.IsNullOrEmpty(l) select l)); _Log.Info(string.Empty); } foreach (KeyValuePair element in fileKeyValuePairs) { fileSystem = queue.Dequeue(); _Log.Warn(string.Concat(element.Key, " - F) [", fileSystem.Display, '}')); // _Log.Info(string.Join(Environment.NewLine, from l in fileSystem where !string.IsNullOrEmpty(l) select l)); _Log.Info(string.Empty); } } private void DisplayFaces(Property.Models.Configuration configuration, Model model, PredictorModel predictorModel, string outputResolution, string selectedFileFullName) { if (_Log is null) throw new Exception($"{nameof(_Log)} is null!"); string requestPath = "/RootResultsDirectory"; string? rootResultsDirectory = Path.GetDirectoryName(Property.Models.Stateless.IResult.GetResultsGroupDirectory(configuration, nameof(B_Metadata))); if (string.IsNullOrEmpty(rootResultsDirectory)) throw new Exception(); string modelName = model.ToString(); string predictorModelName = predictorModel.ToString(); string rootResultsDirectoryAbsoluteUri = new Uri(rootResultsDirectory).AbsoluteUri; string dFacesContentDirectory = Path.Combine(Property.Models.Stateless.IResult.GetResultsFullGroupDirectory(configuration, modelName, predictorModelName, nameof(D_Face), outputResolution, includeResizeGroup: true, includeModel: true, includePredictorModel: true), "()"); string cResizeContentDirectory = Path.Combine(Property.Models.Stateless.IResult.GetResultsFullGroupDirectory(configuration, modelName, predictorModelName, nameof(C_Resize), outputResolution, includeResizeGroup: true, includeModel: false, includePredictorModel: false), "()"); string eDistanceCollectionDirectory = Path.Combine(Property.Models.Stateless.IResult.GetResultsFullGroupDirectory(configuration, modelName, predictorModelName, nameof(E_Distance), outputResolution, includeResizeGroup: true, includeModel: true, includePredictorModel: true), "[]"); (string RootResultsDirectoryAbsoluteUri, string C_ResizeContentDirectory, string D_FacesContentDirectory, string E_DistanceCollectionDirectory) tuple = new(rootResultsDirectoryAbsoluteUri, cResizeContentDirectory, dFacesContentDirectory, eDistanceCollectionDirectory); FaceFileSystem[] faceFileSystemCollection = Shared.Models.Stateless.Methods.IFaceFileSystem.GetFaceFileSystemCollection(requestPath, tuple, selectedFileFullName); for (int i = 0; i < faceFileSystemCollection.Length; i++) { _Log.Warn(string.Concat(i, " - F) [", faceFileSystemCollection[i].Display, '}')); // _Log.Info(string.Join(Environment.NewLine, from l in fileSystemCollection[i] where !string.IsNullOrEmpty(l) select l)); _Log.Info(string.Empty); } // } } private string Rename(Property.Models.Configuration configuration, Model model, PredictorModel predictorModel, string subSourceDirectory) { string result; if (_Log is null) throw new Exception($"{nameof(_Log)} is null!"); if (_Configuration?.PropertyConfiguration is null) throw new Exception($"{nameof(_Configuration.PropertyConfiguration)} must be set!"); _Log.Warn(string.Concat("What is the new name for [", Path.GetFileName(subSourceDirectory), "]<", subSourceDirectory, ">?")); string? newDirectoryName = _Console.ReadLine(); _Log.Warn("Are you sure y[es] || n[o]?"); if (string.IsNullOrEmpty(newDirectoryName) || _Console.ReadKey() != ConsoleKey.Y) { _Log.Warn(string.Empty); _Log.Warn("No changes made."); result = subSourceDirectory; } else { _Log.Warn(string.Empty); string eDistanceCollectionDirectory = Path.Combine(Property.Models.Stateless.IResult.GetResultsFullGroupDirectory(configuration, model.ToString(), predictorModel.ToString(), nameof(E_Distance), _Configuration.ValidResolutions[0], includeResizeGroup: true, includeModel: true, includePredictorModel: true), "[]"); string relativePath = Property.Models.Stateless.IPath.GetRelativePath(subSourceDirectory, eDistanceCollectionDirectory.Length); if (relativePath.Length == 1) throw new Exception(); if (Directory.Exists(Path.Combine(string.Concat(_Configuration.PropertyConfiguration.RootDirectory, Path.GetDirectoryName(relativePath)), newDirectoryName))) { _Log.Warn("\"To\" directory already exits!"); result = subSourceDirectory; } else { _Rename.DirectoryRename(configuration, model, predictorModel, relativePath, newDirectoryName); _Log.Warn("Renamed..."); string? directoryName = Path.GetDirectoryName(subSourceDirectory); if (string.IsNullOrEmpty(directoryName)) throw new Exception(); result = Path.Combine(directoryName, newDirectoryName); } } return result; } internal void Navigate(Property.Models.Configuration configuration, Model model, PredictorModel predictorModel, string outputResolution) { if (_Log is null) throw new Exception($"{nameof(_Log)} is null!"); string[] subFiles; ConsoleKey consoleKey; string[] subDirectories; string selectedFileFullName; string rootDirectory = string.Empty; string? subSourceDirectory = string.Empty; Dictionary fileKeyValuePairs = new(); Dictionary directoryKeyValuePairs = new(); string eDistanceCollectionDirectory = Path.Combine(Property.Models.Stateless.IResult.GetResultsFullGroupDirectory(configuration, model.ToString(), predictorModel.ToString(), nameof(E_Distance), _Configuration.OutputResolutions[0], includeResizeGroup: true, includeModel: true, includePredictorModel: true), "[]"); if (!Directory.Exists(eDistanceCollectionDirectory)) _ = Directory.CreateDirectory(eDistanceCollectionDirectory); for (int z = 0; z < int.MaxValue; z++) { if (string.IsNullOrEmpty(subSourceDirectory)) { rootDirectory = eDistanceCollectionDirectory; subSourceDirectory = rootDirectory; } subFiles = Directory.GetFiles(subSourceDirectory, "*.json", SearchOption.TopDirectoryOnly); subDirectories = Directory.GetDirectories(subSourceDirectory, "*", SearchOption.TopDirectoryOnly); directoryKeyValuePairs.Clear(); for (int i = (int)ConsoleKey.A; i < (subDirectories.Length + (int)ConsoleKey.A) && i <= (int)ConsoleKey.RightWindows; i++) directoryKeyValuePairs.Add((ConsoleKey)i, i - (int)ConsoleKey.A); fileKeyValuePairs.Clear(); for (int i = (int)ConsoleKey.A + subDirectories.Length; i < (subFiles.Length + (int)ConsoleKey.A + subDirectories.Length) && i <= (int)ConsoleKey.RightWindows; i++) fileKeyValuePairs.Add((ConsoleKey)i, i - (int)ConsoleKey.A); if (!directoryKeyValuePairs.Any() && !fileKeyValuePairs.Any()) break; _Log.Warn(""); DisplayTags(configuration, model, predictorModel, outputResolution, subDirectories, directoryKeyValuePairs, subFiles, fileKeyValuePairs); _Log.Warn(string.Empty); _Log.Warn(string.Empty); _Log.Warn(string.Empty); _Log.Warn("Select a file system object. Enter \"Backspace\" to go up a directory, \"F2\" to rename and \"Esc\" to end navigation."); consoleKey = _Console.ReadKey(); _Log.Warn(string.Empty); if (consoleKey == ConsoleKey.Escape) break; if (consoleKey == ConsoleKey.F2) { if (subSourceDirectory == rootDirectory) { _Log.Warn("Root directory can not be renamed! Try again."); continue; } else { subSourceDirectory = Rename(configuration, model, predictorModel, subSourceDirectory); continue; } } else if (consoleKey is ConsoleKey.Backspace or ConsoleKey.LeftArrow) { if (subSourceDirectory != rootDirectory) subSourceDirectory = Path.GetDirectoryName(subSourceDirectory); else { _Log.Warn("At root directory. Try again."); continue; } } else if (directoryKeyValuePairs.ContainsKey(consoleKey)) { subSourceDirectory = subDirectories[directoryKeyValuePairs[consoleKey]]; _Log.Warn(string.Concat(">>> [", Path.GetFileName(subSourceDirectory), "]<", subSourceDirectory, ">?")); continue; } else { if (!fileKeyValuePairs.ContainsKey(consoleKey)) { subSourceDirectory = _ArgZero; _Log.Warn("Invalid selection. Try again."); continue; } else { selectedFileFullName = subFiles[fileKeyValuePairs[consoleKey]]; _Log.Warn(string.Concat(">>> [", Path.GetFileName(selectedFileFullName), "]<", selectedFileFullName, ">?")); DisplayFaces(configuration, model, predictorModel, outputResolution, selectedFileFullName); _Log.Warn(string.Empty); _Log.Warn(string.Empty); _Log.Warn(string.Empty); _Log.Warn("Go up a directory? Enter escape end."); consoleKey = _Console.ReadKey(); if (consoleKey == ConsoleKey.Escape) break; subSourceDirectory = Path.GetDirectoryName(subSourceDirectory); continue; } } } } }