// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Collections.Generic;
using System.IO;

#nullable disable

namespace Microsoft.Build.Shared.FileSystem
{

    /*
     * This is a clone of Microsoft.Build.FileSystem.MSBuildFileSystemBase.
     * MSBuildFileSystemBase is the public, reference interface. Changes should be made to MSBuildFileSystemBase and cloned in IFileSystem.
     * Any new code should depend on MSBuildFileSystemBase instead of IFileSystem, if possible.
     *
     * MSBuild uses IFileSystem internally and adapts MSBuildFileSystemBase instances received from the outside to IFileSystem.
     * Ideally there should be only one, public interface. However, such an interface would need to be put into the
     * Microsoft.Build.Framework assembly, but that assembly cannot take new types because it breaks some old version of Nuget.exe.
     * IFileSystem cannot be deleted for the same reason.
     */
    internal interface IFileSystem
    {
        TextReader ReadFile(string path);

        Stream GetFileStream(string path, FileMode mode, FileAccess access, FileShare share);

        string ReadFileAllText(string path);

        byte[] ReadFileAllBytes(string path);

        IEnumerable<string> EnumerateFiles(string path, string searchPattern = "*", SearchOption searchOption = SearchOption.TopDirectoryOnly);

        IEnumerable<string> EnumerateDirectories(string path, string searchPattern = "*", SearchOption searchOption = SearchOption.TopDirectoryOnly);

        IEnumerable<string> EnumerateFileSystemEntries(string path, string searchPattern = "*", SearchOption searchOption = SearchOption.TopDirectoryOnly);

        FileAttributes GetAttributes(string path);

        public DateTime GetLastWriteTimeUtc(string path);

        bool DirectoryExists(string path);

        bool FileExists(string path);

        bool FileOrDirectoryExists(string path);
    }
}
