//
//  AppShortcutItems.swift
//  Tusker
//
//  Created by Shadowfacts on 9/19/19.
//  Copyright © 2019 Shadowfacts. All rights reserved.
//

import UIKit

enum AppShortcutItem: String, CaseIterable {
    case showHomeTimeline
    case showNotifications
    case composePost
    
    var title: String {
        switch self {
        case .showHomeTimeline:
            return NSLocalizedString("Home", comment: "home app shortcut title")
        case .showNotifications:
            return NSLocalizedString("Notifications", comment: "notifications app shortcut title")
        case .composePost:
            return NSLocalizedString("Compose Post", comment: "compose post app shortcut title")
        }
    }
    
    var icon: UIApplicationShortcutIcon {
        switch self {
        case .showHomeTimeline:
            return .init(type: .home)
        case .showNotifications:
            return .init(systemImageName: "bell.fill")
        case .composePost:
            return .init(type: .compose)
        }
    }
    
    @MainActor
    func handle() {
        let scene = UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.first!
        let window = scene.windows.first { $0.isKeyWindow }!
        guard let root = window.rootViewController as? TuskerRootViewController else {
            return
        }
        switch self {
        case .showHomeTimeline:
            root.select(route: .timelines, animated: false)
        case .showNotifications:
            root.select(route: .notifications, animated: false)
        case .composePost:
            root.compose(editing: nil, animated: false, isDucked: false)
        }
    }
}

extension AppShortcutItem {
    static func createItems(for application: UIApplication) {
        application.shortcutItems = allCases.map {
            return UIApplicationShortcutItem(type: $0.rawValue, localizedTitle: $0.title, localizedSubtitle: nil, icon: $0.icon, userInfo: nil)
        }
    }
    
    @MainActor
    static func handle(_ shortcutItem: UIApplicationShortcutItem) -> Bool {
        guard let type = AppShortcutItem(rawValue: shortcutItem.type) else { return false }
        type.handle()
        return true
    }
}
