import Foundation
import XCTestDynamicOverlay

public struct MessengerFileManager {
  public var isDirectoryEmpty: (String) -> Bool
  public var removeDirectory: (String) throws -> Void
  public var createDirectory: (String) throws -> Void
}

extension MessengerFileManager {
  public static func live(
    fileManager: FileManager = .default
  ) -> MessengerFileManager {
    MessengerFileManager(
      isDirectoryEmpty: { path in
        let contents = try? fileManager.contentsOfDirectory(atPath: path)
        return contents?.isEmpty ?? true
      },
      removeDirectory: { path in
        if fileManager.fileExists(atPath: path) {
          try fileManager.removeItem(atPath: path)
        }
      },
      createDirectory: { path in
        try fileManager.createDirectory(
          atPath: path,
          withIntermediateDirectories: true
        )
      }
    )
  }
}

extension MessengerFileManager {
  public static let unimplemented = MessengerFileManager(
    isDirectoryEmpty: XCTUnimplemented("\(Self.self).isDirectoryEmpty", placeholder: false),
    removeDirectory: XCTUnimplemented("\(Self.self).removeDirectory"),
    createDirectory: XCTUnimplemented("\(Self.self).createDirectory")
  )
}