import Foundation
import SwiftSignalKit
import TelegramCore
import DeviceAccess
import AccountContext

public enum PermissionKind: Int32 {
    case contacts
    case notifications
    case siri
    case cellularData
    case nearbyLocation
}

public enum PermissionRequestStatus {
    case requestable
    case denied
    case unreachable
    case allowed
    
    public init(accessType: AccessType) {
        switch accessType {
            case .notDetermined:
                self = .requestable
            case .denied, .restricted:
                self = .denied
            case .unreachable:
                self = .unreachable
            case .allowed:
                self = .allowed
        }
    }
}

public enum PermissionState: Equatable {
    case contacts(status: PermissionRequestStatus)
    case notifications(status: PermissionRequestStatus)
    case siri(status: PermissionRequestStatus)
    case cellularData(status: PermissionRequestStatus)
    case nearbyLocation(status: PermissionRequestStatus)
    
    public var kind: PermissionKind {
        switch self {
            case .contacts:
                return .contacts
            case .notifications:
                return .notifications
            case .siri:
                return .siri
            case .cellularData:
                return .cellularData
            case .nearbyLocation:
                return .nearbyLocation
        }
    }
    
    public var status: PermissionRequestStatus {
        switch self {
            case let .contacts(status):
                return status
            case let .notifications(status):
                return status
            case let .siri(status):
                return status
            case let .cellularData(status):
                return status
            case let .nearbyLocation(status):
                return status
        }
    }
}

public func requiredPermissions(context: AccountContext) -> Signal<(contacts: PermissionState, notifications: PermissionState, cellularData: PermissionState, siri: PermissionState), NoError> {
    return combineLatest(DeviceAccess.authorizationStatus(subject: .contacts), DeviceAccess.authorizationStatus(applicationInForeground: context.sharedContext.applicationBindings.applicationInForeground, subject: .notifications), DeviceAccess.authorizationStatus(siriAuthorization: {
        return context.sharedContext.applicationBindings.siriAuthorization()
    }, subject: .cellularData), DeviceAccess.authorizationStatus(siriAuthorization: {
        return context.sharedContext.applicationBindings.siriAuthorization()
    }, subject: .siri))
    |> map { contactsStatus, notificationsStatus, cellularDataStatus, siriStatus in
        return (.contacts(status: PermissionRequestStatus(accessType: contactsStatus)), .notifications(status: PermissionRequestStatus(accessType: notificationsStatus)), .cellularData(status: PermissionRequestStatus(accessType: cellularDataStatus)), .siri(status: PermissionRequestStatus(accessType: siriStatus)))
    }
}