using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using ShellProgressBar; using View_by_Distance.Metadata.Models; using View_by_Distance.Rename.Models; using View_by_Distance.Shared.Models; using View_by_Distance.Shared.Models.Stateless.Methods; namespace View_by_Distance.Rename; public class Rename { private readonly AppSettings _AppSettings; private readonly Configuration _Configuration; private readonly IConfigurationRoot _ConfigurationRoot; private readonly MetadataConfiguration _MetadataConfiguration; public Rename(List args, ILogger? logger, IConfigurationRoot configurationRoot, AppSettings appSettings, bool isSilent, IConsole console) { if (isSilent) { } if (args is null) throw new NullReferenceException(nameof(args)); if (console is null) throw new NullReferenceException(nameof(console)); _AppSettings = appSettings; long ticks = DateTime.Now.Ticks; _ConfigurationRoot = configurationRoot; MetadataConfiguration metadataConfiguration = Metadata.Models.Binder.Configuration.Get(configurationRoot); Configuration configuration = Models.Binder.Configuration.Get(configurationRoot, metadataConfiguration); _MetadataConfiguration = metadataConfiguration; _Configuration = configuration; DirectoryInfo directoryInfo = new(Path.GetFullPath(metadataConfiguration.RootDirectory)); logger?.LogInformation("{RootDirectory}", directoryInfo.FullName); MetadataConfiguration.Verify(metadataConfiguration, requireExist: false); Verify(); List linesB = RenameFilesInDirectories(logger, ticks, directoryInfo); if (linesB.Count != 0) { File.WriteAllLines($"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv", linesB); _ = IPath.DeleteEmptyDirectories(directoryInfo.FullName); } } private void Verify() { if (_AppSettings is null) throw new NullReferenceException(nameof(_AppSettings)); if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); if (_ConfigurationRoot is null) throw new NullReferenceException(nameof(_ConfigurationRoot)); if (_MetadataConfiguration is null) throw new NullReferenceException(nameof(_MetadataConfiguration)); } private bool GetRunToDoCollectionFirst(long ticks, DirectoryInfo directoryInfo) { bool result = false; string[] directories; string seasonDirectory; DateTime dateTime = new(ticks); (int season, string seasonName) = IDate.GetSeason(dateTime.DayOfYear); string eDistanceContentDirectory = IResult.GetResultsDateGroupDirectory(_MetadataConfiguration, nameof(A_Metadata), _MetadataConfiguration.ResultContent); FileSystemInfo fileSystemInfo = new DirectoryInfo(eDistanceContentDirectory); string[] checkDirectories = [ Path.Combine(directoryInfo.FullName, "Ancestry"), Path.Combine(directoryInfo.FullName, "Facebook"), Path.Combine(directoryInfo.FullName, "LinkedIn"), directoryInfo.FullName, ]; foreach (string checkDirectory in checkDirectories) { if (checkDirectory == directoryInfo.FullName) seasonDirectory = Path.Combine(checkDirectory, $"{dateTime.Year}.{season} {seasonName}"); else seasonDirectory = Path.Combine(checkDirectory, $"{dateTime.Year}.{season} {seasonName} {Path.GetFileName(checkDirectory)}"); if (!Directory.Exists(seasonDirectory)) _ = Directory.CreateDirectory(seasonDirectory); if (result) continue; directories = Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string directory in directories) { if (new DirectoryInfo(directory).LastWriteTime > fileSystemInfo.LastWriteTime) { result = true; break; } } } return result; } private List RenameFilesInDirectories(ILogger? logger, long ticks, DirectoryInfo directoryInfo) { List old = []; List exifDirectories = []; bool runToDoCollectionFirst = GetRunToDoCollectionFirst(ticks, directoryInfo); IEnumerable files = Directory.EnumerateFiles(directoryInfo.FullName, "*", SearchOption.AllDirectories); A_Metadata metadata = new(_MetadataConfiguration, _Configuration.ForceMetadataLastWriteTimeToCreationTime, _Configuration.PropertiesChangedForMetadata); if (runToDoCollectionFirst) { foreach (string file in files) { NameWithoutExtension nameWithoutExtension = IId.GetNameWithoutExtension(_MetadataConfiguration, file); exifDirectories.Add(metadata.GetMetadataCollection(_MetadataConfiguration, file, nameWithoutExtension)); if (nameWithoutExtension.Id is null || (!nameWithoutExtension.IsIdFormat && !nameWithoutExtension.IsPaddedIdFormat)) ; } } else { ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism }; ProgressBar progressBar = new(123000, "EnumerateFiles load", new ProgressBarOptions() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }); files.AsParallel().ForAll(A_Metadata.GetResultCollection(_MetadataConfiguration, metadata, exifDirectories, () => progressBar.Tick())); if (progressBar.CurrentTick != exifDirectories.Count) throw new NotSupportedException(); } return old; } }