namespace Barcode.Host.Shared.Models;

internal abstract class WorkingDirectory
{

    internal static string GetWorkingDirectory(string? executingAssemblyName, string subDirectoryName)
    {
        string result = string.Empty;
        if (executingAssemblyName is null)
            throw new Exception();
        string traceFile;
        List<string> directories = new();
        Environment.SpecialFolder[] specialFolders = new Environment.SpecialFolder[]
        {
                    Environment.SpecialFolder.LocalApplicationData,
                    Environment.SpecialFolder.ApplicationData,
                    Environment.SpecialFolder.History,
                    Environment.SpecialFolder.CommonApplicationData,
                    Environment.SpecialFolder.InternetCache
        };
        foreach (Environment.SpecialFolder specialFolder in specialFolders)
            directories.Add(Path.Combine(Environment.GetFolderPath(specialFolder), subDirectoryName, executingAssemblyName));
        foreach (string directory in directories)
        {
            for (int i = 1; i < 3; i++)
            {
                if (i == 1)
                    result = directory;
                else
                    result = string.Concat("D", directory[1..]);
                try
                {
                    if (!Directory.Exists(result))
                        _ = Directory.CreateDirectory(result);
                    traceFile = Path.Combine(result, $"{DateTime.Now.Ticks}.txt");
                    File.WriteAllText(traceFile, traceFile);
                    File.Delete(traceFile);
                    break;
                }
                catch (Exception) { result = string.Empty; }
            }
            if (!string.IsNullOrEmpty(result))
                break;
        }
        if (string.IsNullOrEmpty(result))
            throw new Exception("Unable to set working directory!");
        return result;
    }

}