using Microsoft.Extensions.Configuration; using Phares.Shared; using Serilog; using ShellProgressBar; using View_by_Distance.Mirror.Length.Models; using View_by_Distance.Shared.Models.Methods; namespace View_by_Distance.Mirror.Length; public class MirrorLength { private readonly AppSettings _AppSettings; private readonly string _WorkingDirectory; private readonly Configuration _Configuration; private readonly IsEnvironment _IsEnvironment; private readonly IConfigurationRoot _ConfigurationRoot; private readonly Property.Models.Configuration _PropertyConfiguration; public MirrorLength(List args, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console) { if (isSilent) { } if (console is null) { } _AppSettings = appSettings; _IsEnvironment = isEnvironment; _WorkingDirectory = workingDirectory; _ConfigurationRoot = configurationRoot; ILogger? log = Log.ForContext(); Property.Models.Configuration propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot); Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration); _PropertyConfiguration = propertyConfiguration; _Configuration = configuration; propertyConfiguration.Update(); log.Information(propertyConfiguration.RootDirectory); Verify(); List lines = MirrorLengthFilesInDirectories(log); if (!lines.Any()) File.WriteAllLines($"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv", lines); } private void Verify() { if (_AppSettings is null) { } if (_IsEnvironment is null) { } if (_Configuration is null) { } if (_ConfigurationRoot is null) { } if (_WorkingDirectory is null) { } if (_PropertyConfiguration is null) { } } private static List<(string, string, DateTime, long)[]> GetToDoCollection(ProgressBar progressBar, List filesCollection) { List<(string, string, DateTime, long)[]> results = new(); FileInfo fileInfo; List lines = new(); List<(string, string, DateTime, long)> collection; foreach (string[] files in filesCollection) { lines.Clear(); progressBar.Tick(); collection = new(); foreach (string file in files) { if (file.EndsWith("len")) continue; fileInfo = new(file); if (string.IsNullOrEmpty(fileInfo.DirectoryName)) continue; collection.Add((fileInfo.DirectoryName, file, fileInfo.LastWriteTime, fileInfo.Length)); } if (!collection.Any()) continue; results.Add(collection.ToArray()); } return results; } private void Save(ProgressBar progressBar, List<(string directory, string file, DateTime lastWriteTime, long length)[]> results) { string checkFile; string checkDirectory; string? firstDirectory; List directories = new(); foreach ((string Directory, string, DateTime, long)[] collection in results) { progressBar.Tick(); directories.Clear(); firstDirectory = collection.First().Directory; if (string.IsNullOrEmpty(firstDirectory)) continue; checkDirectory = $"{_AppSettings.Destination}{firstDirectory[1..]}"; if (Directory.Exists(checkDirectory)) continue; _ = Directory.CreateDirectory(checkDirectory); foreach ((string directory, string _, DateTime _, long _) in collection) { checkDirectory = $"{_AppSettings.Destination}{directory[1..]}"; if (directories.Contains(checkDirectory)) continue; directories.Add(checkDirectory); if (!Directory.Exists(checkDirectory)) _ = Directory.CreateDirectory(checkDirectory); } foreach ((string _, string file, DateTime lastWriteTime, long length) in collection) { checkFile = $"{_AppSettings.Destination}{file[1..]}len"; if (!Shared.Models.Stateless.Methods.IPath.WriteAllText(checkFile, length.ToString(), updateToWhenMatches: null, compareBeforeWrite: true, updateDateWhenMatches: false)) continue; File.SetLastWriteTime(checkFile, lastWriteTime); } } } private List MirrorLengthFilesInDirectories(ILogger log) { List results = new(); ProgressBar progressBar; const string fileSearchFilter = "*"; string message = nameof(MirrorLength); const string directorySearchFilter = "*"; List distinctDirectories = new(); List filesCollection = Shared.Models.Stateless.Methods.IDirectory.GetFilesCollection(_PropertyConfiguration.RootDirectory, directorySearchFilter, fileSearchFilter); ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; progressBar = new(filesCollection.Count, message, options); List<(string, string, DateTime, long)[]> collection = GetToDoCollection(progressBar, filesCollection); progressBar.Dispose(); progressBar = new(filesCollection.Count, message, options); Save(progressBar, collection); progressBar.Dispose(); return results; } }