using System.Collections.ObjectModel;

namespace View_by_Distance.Shared.Models.Stateless.Methods;

public interface IPath
{ // ...

    string TestStatic_GetRelativePath(string path, int length) =>
        GetRelativePath(path, length);
    static string GetRelativePath(string path, int length) =>
        XPath.GetRelativePath(path, length, forceExtensionToLower: false);

    bool TestStatic_DeleteEmptyDirectories(string rootDirectory) =>
        DeleteEmptyDirectories(rootDirectory);
    static bool DeleteEmptyDirectories(string rootDirectory) =>
        XPath.DeleteEmptyDirectories(rootDirectory);

    void TestStatic_ChangeDateForEmptyDirectories(string rootDirectory, long ticks) =>
        ChangeDateForEmptyDirectories(rootDirectory, ticks);
    static void ChangeDateForEmptyDirectories(string rootDirectory, long ticks) =>
        XPath.ChangeDateForEmptyDirectories(rootDirectory, ticks);

    void TestStatic_MakeHiddenIfAllItemsAreHidden(string rootDirectory) =>
        MakeHiddenIfAllItemsAreHidden(rootDirectory);
    static void MakeHiddenIfAllItemsAreHidden(string rootDirectory) =>
        XPath.MakeHiddenIfAllItemsAreHidden(rootDirectory);

    void TestStatic_DeleteEmptyDirectories(string rootDirectory, List<string> deletedDirectories) =>
        DeleteEmptyDirectories(rootDirectory, deletedDirectories);
    static void DeleteEmptyDirectories(string rootDirectory, List<string> deletedDirectories) =>
        XPath.DeleteEmptyDirectories(rootDirectory, deletedDirectories);
    // $dirs = gci "" -directory -recurse | Where { (gci $_.fullName).count -eq 0 } | select -expandproperty FullName $dirs | Foreach-Object { Remove-Item $_ }

    string[] TestStatic_GetDirectoryNames(string directory) =>
        GetDirectoryNames(directory);
    static string[] GetDirectoryNames(string directory) =>
        XPath.GetDirectoryNames(directory).ToArray();

    string[] TestStatic_GetDirectories(string directory) =>
        GetDirectories(directory);
    static string[] GetDirectories(string directory) =>
        XPath.GetDirectories(directory).ToArray();

    string TestStatic_GetRelativePath(string path, int length, bool forceExtensionToLower) =>
        GetRelativePath(path, length, forceExtensionToLower);
    static string GetRelativePath(string path, int length, bool forceExtensionToLower) =>
        XPath.GetRelativePath(path, length, forceExtensionToLower);

    bool TestStatic_WriteAllText(string path, string contents, bool updateDateWhenMatches, bool compareBeforeWrite, DateTime? updateToWhenMatches = null) =>
        WriteAllText(path, contents, updateDateWhenMatches, compareBeforeWrite, updateToWhenMatches);
    static bool WriteAllText(string path, string contents, bool updateDateWhenMatches, bool compareBeforeWrite, DateTime? updateToWhenMatches = null) =>
        XPath.WriteAllText(path, contents, updateDateWhenMatches, compareBeforeWrite, updateToWhenMatches);

    (int level, List<string> directories) TestStatic_Get(string rootDirectory, string sourceDirectory) =>
        Get(rootDirectory, sourceDirectory);
    static (int level, List<string> directories) Get(string rootDirectory, string sourceDirectory) =>
        XPath.Get(rootDirectory, sourceDirectory);

    string TestStatic_GetDirectory(string sourceDirectory, int level, string directoryName) =>
        GetDirectory(sourceDirectory, level, directoryName);
    static string GetDirectory(string sourceDirectory, int level, string directoryName) =>
        XPath.GetDirectory(sourceDirectory, level, directoryName);

    (string, int) TestStatic_GetDirectoryNameAndIndex(ResultConfiguration resultConfiguration, FileHolder fileHolder) =>
        GetDirectoryNameAndIndex(resultConfiguration, fileHolder);
    static (string, int) GetDirectoryNameAndIndex(ResultConfiguration resultConfiguration, FileHolder fileHolder) =>
        XPath.GetDirectoryNameAndIndex(resultConfiguration, fileHolder);

    (string, int) TestStatic_GetDirectoryNameAndIndex(ResultConfiguration resultConfiguration, FilePath filePath) =>
        GetDirectoryNameAndIndex(resultConfiguration, filePath);
    static (string, int) GetDirectoryNameAndIndex(ResultConfiguration resultConfiguration, FilePath filePath) =>
        XPath.GetDirectoryNameAndIndex(resultConfiguration, filePath);

    (string, int) TestStatic_GetDirectoryNameAndIndex(ResultConfiguration resultConfiguration, int id) =>
        GetDirectoryNameAndIndex(resultConfiguration, id);
    static (string, int) GetDirectoryNameAndIndex(ResultConfiguration resultConfiguration, int id) =>
        XPath.GetDirectoryNameAndIndex(resultConfiguration, id);

    ReadOnlyDictionary<int, ReadOnlyDictionary<string, string[]>> TestStatic_GetKeyValuePairs(ResultConfiguration resultConfiguration, string? resultsFullGroupDirectory, string[]? directories) =>
        GetKeyValuePairs(resultConfiguration, resultsFullGroupDirectory, directories);
    static ReadOnlyDictionary<int, ReadOnlyDictionary<string, string[]>> GetKeyValuePairs(ResultConfiguration resultConfiguration, string? resultsFullGroupDirectory, string[]? directories) =>
        XPath.GetKeyValuePairs(resultConfiguration, resultsFullGroupDirectory, directories);

}