using DiscUtils.Iso9660;
using Microsoft.Extensions.Logging;

namespace File_Folder_Helper.ADO2024.PI1;

internal static partial class Helper20240107
{

    private static void DirectoryToISO(ILogger<Worker> logger, string destinationDirectory, bool mapOnly, string directory)
    {
        byte[] bytes = [];
        string relativePath;
        string directoryName = Path.GetFileName(directory);
        CDBuilder builder = new() { UseJoliet = true, VolumeIdentifier = directoryName.Length < 25 ? directoryName : directoryName[..25] };
        IEnumerable<string> files = Directory.EnumerateFiles(directory, "*", new EnumerationOptions { IgnoreInaccessible = true, RecurseSubdirectories = true });
        foreach (string file in files)
        {
            relativePath = Path.GetRelativePath(directory, file).Replace(';', '_');
            if (!mapOnly)
                _ = builder.AddFile(relativePath, file);
            else
                _ = builder.AddFile(relativePath, bytes);
        }
        logger.LogInformation(destinationDirectory);
        builder.Build(Path.Combine(destinationDirectory, $"{directoryName}.iso"));
        logger.LogInformation(directoryName);
    }

    internal static void DirectoryToISO(ILogger<Worker> logger, List<string> args)
    {
        string sourceDirectory = args[0];
        int directories = int.Parse(args[2]);
        string destinationDirectory = args[3];
        logger.LogInformation(sourceDirectory);
        if (sourceDirectory == "C:/ProgramData")
        {
            sourceDirectory = destinationDirectory;
            destinationDirectory = Path.GetDirectoryName(destinationDirectory) ?? throw new NotSupportedException();
        }
        bool mapOnly = sourceDirectory.Length == 2;
        if (!Directory.Exists(destinationDirectory))
            _ = Directory.CreateDirectory(destinationDirectory);
        string[] subDirectories = directories == 1 ? [sourceDirectory] : Directory.GetDirectories(sourceDirectory, "*", SearchOption.TopDirectoryOnly);
        if (subDirectories.Length != directories)
            throw new Exception($"{directories} != {subDirectories.Length}");
        foreach (string directory in subDirectories)
            DirectoryToISO(logger, destinationDirectory, mapOnly, directory);
    }

}