import UIKit
import Keychain
import Presentation
import DependencyInjection

public typealias SFTPAuthorizationParams = (UIViewController, () -> Void)

public struct SFTPService {
    public var isAuthorized: () -> Bool
    public var fetchMetadata: SFTPFetcher
    public var uploadBackup: SFTPUploader
    public var authorizeFlow: (SFTPAuthorizationParams) -> Void
    public var authenticate: SFTPAuthenticator
    public var downloadBackup: SFTPDownloader
}

public extension SFTPService {
    static var mock = SFTPService(
        isAuthorized: { true },
        fetchMetadata: .mock,
        uploadBackup: .mock,
        authorizeFlow: { (_, completion) in completion() },
        authenticate: .mock,
        downloadBackup: .mock
    )

    static var live = SFTPService(
        isAuthorized: {
            if let keychain = try? DependencyInjection.Container.shared.resolve() as KeychainHandling,
               let pwd = try? keychain.get(key: .pwd),
               let host = try? keychain.get(key: .host),
               let username = try? keychain.get(key: .username) {
                return true
            }

            return false
        },
        fetchMetadata: .live,
        uploadBackup: .live ,
        authorizeFlow: { controller, completion in
            var pushPresenter: Presenting = PushPresenter()
            pushPresenter.present(SFTPController(completion), from: controller)
        },
        authenticate: .live,
        downloadBackup: .live
    )
}