import AVFoundation
import XCTestDynamicOverlay

public struct PermissionCamera {
  public var status: PermissionCameraStatus
  public var request: PermissionCameraRequest

  public static let live = PermissionCamera(
    status: .live,
    request: .live
  )
  public static let unimplemented = PermissionCamera(
    status: .unimplemented,
    request: .unimplemented
  )
}

public struct PermissionCameraStatus {
  public var run: () -> Bool

  public func callAsFunction() -> Bool {
    run()
  }

  public static let live = PermissionCameraStatus {
    AVCaptureDevice.authorizationStatus(for: .video) == .authorized
  }

  public static let unimplemented = PermissionCameraStatus(
    run: XCTUnimplemented("\(Self.self)")
  )
}

public struct PermissionCameraRequest {
  public var run: (@escaping (Bool) -> Void) -> Void

  public func callAsFunction(_ completion: @escaping (Bool) -> Void) -> Void {
    run(completion)
  }

  public static let live = PermissionCameraRequest {
    AVCaptureDevice.requestAccess(for: .video, completionHandler: $0)
  }

  public static let unimplemented = PermissionCameraRequest(
    run: XCTUnimplemented("\(Self.self)")
  )
}