// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//

public struct NSCocoaError : RawRepresentable, ErrorProtocol, __BridgedNSError {
    public let rawValue: Int
    public init(rawValue: Int) {
        self.rawValue = rawValue
    }
    public static var __NSErrorDomain: String { return NSCocoaErrorDomain }
}

/// Enumeration that describes the error codes within the Cocoa error
/// domain.
public extension NSCocoaError {
    
    public static var FileNoSuchFileError: NSCocoaError {
        return NSCocoaError(rawValue: 4)
    }
    
    public static var FileLockingError: NSCocoaError {
        return NSCocoaError(rawValue: 255)
    }
    
    public static var FileReadUnknownError: NSCocoaError {
        return NSCocoaError(rawValue: 256)
    }
    
    public static var FileReadNoPermissionError: NSCocoaError {
        return NSCocoaError(rawValue: 257)
    }
    
    public static var FileReadInvalidFileNameError: NSCocoaError {
        return NSCocoaError(rawValue: 258)
    }
    
    public static var FileReadCorruptFileError: NSCocoaError {
        return NSCocoaError(rawValue: 259)
    }
    
    public static var FileReadNoSuchFileError: NSCocoaError {
        return NSCocoaError(rawValue: 260)
    }
    
    public static var FileReadInapplicableStringEncodingError: NSCocoaError {
        return NSCocoaError(rawValue: 261)
    }
    public static var FileReadUnsupportedSchemeError: NSCocoaError {
        return NSCocoaError(rawValue: 262)
    }
    
    public static var FileReadTooLargeError: NSCocoaError {
        return NSCocoaError(rawValue: 263)
    }
    
    public static var FileReadUnknownStringEncodingError: NSCocoaError {
        return NSCocoaError(rawValue: 264)
    }
    
    public static var FileWriteUnknownError: NSCocoaError {
        return NSCocoaError(rawValue: 512)
    }
    
    public static var FileWriteNoPermissionError: NSCocoaError {
        return NSCocoaError(rawValue: 513)
    }
    
    public static var FileWriteInvalidFileNameError: NSCocoaError {
        return NSCocoaError(rawValue: 514)
    }
    
    public static var FileWriteFileExistsError: NSCocoaError {
        return NSCocoaError(rawValue: 516)
    }
    
    public static var FileWriteInapplicableStringEncodingError: NSCocoaError {
        return NSCocoaError(rawValue: 517)
    }
    
    public static var FileWriteUnsupportedSchemeError: NSCocoaError {
        return NSCocoaError(rawValue: 518)
    }
    
    public static var FileWriteOutOfSpaceError: NSCocoaError {
        return NSCocoaError(rawValue: 640)
    }
    
    public static var FileWriteVolumeReadOnlyError: NSCocoaError {
        return NSCocoaError(rawValue: 642)
    }
    
    public static var FileManagerUnmountUnknownError: NSCocoaError {
        return NSCocoaError(rawValue: 768)
    }
    
    public static var FileManagerUnmountBusyError: NSCocoaError {
        return NSCocoaError(rawValue: 769)
    }
    
    public static var KeyValueValidationError: NSCocoaError {
        return NSCocoaError(rawValue: 1024)
    }
    
    public static var FormattingError: NSCocoaError {
        return NSCocoaError(rawValue: 2048)
    }
    
    public static var UserCancelledError: NSCocoaError {
        return NSCocoaError(rawValue: 3072)
    }
    
    public static var FeatureUnsupportedError: NSCocoaError {
        return NSCocoaError(rawValue: 3328)
    }
    
    public static var ExecutableNotLoadableError: NSCocoaError {
        return NSCocoaError(rawValue: 3584)
    }
    
    public static var ExecutableArchitectureMismatchError: NSCocoaError {
        return NSCocoaError(rawValue: 3585)
    }
    
    public static var ExecutableRuntimeMismatchError: NSCocoaError {
        return NSCocoaError(rawValue: 3586)
    }
    
    public static var ExecutableLoadError: NSCocoaError {
        return NSCocoaError(rawValue: 3587)
    }
    
    public static var ExecutableLinkError: NSCocoaError {
        return NSCocoaError(rawValue: 3588)
    }
    
    public static var PropertyListReadCorruptError: NSCocoaError {
        return NSCocoaError(rawValue: 3840)
    }

    public static var PropertyListReadUnknownVersionError: NSCocoaError {
        return NSCocoaError(rawValue: 3841)
    }
    
    public static var PropertyListReadStreamError: NSCocoaError {
        return NSCocoaError(rawValue: 3842)
    }
    
    public static var PropertyListWriteStreamError: NSCocoaError {
        return NSCocoaError(rawValue: 3851)
    }
    
    public static var PropertyListWriteInvalidError: NSCocoaError {
        return NSCocoaError(rawValue: 3852)
    }
    
    public static var XPCConnectionInterrupted: NSCocoaError {
        return NSCocoaError(rawValue: 4097)
    }
    
    public static var XPCConnectionInvalid: NSCocoaError {
        return NSCocoaError(rawValue: 4099)
    }
    
    public static var XPCConnectionReplyInvalid: NSCocoaError {
        return NSCocoaError(rawValue: 4101)
    }
    
    public static var UbiquitousFileUnavailableError: NSCocoaError {
        return NSCocoaError(rawValue: 4353)
    }
    
    public static var UbiquitousFileNotUploadedDueToQuotaError: NSCocoaError {
        return NSCocoaError(rawValue: 4354)
    }

    public static var UbiquitousFileUbiquityServerNotAvailable: NSCocoaError {
        return NSCocoaError(rawValue: 4355)
    }
    
    public static var UserActivityHandoffFailedError: NSCocoaError {
        return NSCocoaError(rawValue: 4608)
    }
    
    public static var UserActivityConnectionUnavailableError: NSCocoaError {
        return NSCocoaError(rawValue: 4609)
    }
    
    public static var UserActivityRemoteApplicationTimedOutError: NSCocoaError {
        return NSCocoaError(rawValue: 4610)
    }
    
    public static var UserActivityHandoffUserInfoTooLargeError: NSCocoaError {
        return NSCocoaError(rawValue: 4611)
    }
    
    public static var CoderReadCorruptError: NSCocoaError {
        return NSCocoaError(rawValue: 4864)
    }
    
    public static var CoderValueNotFoundError: NSCocoaError {
        return NSCocoaError(rawValue: 4865)
    }
    
    public var isCoderError: Bool {
        return rawValue >= 4864 && rawValue <= 4991
    }
    
    public var isExecutableError: Bool {
        return rawValue >= 3584 && rawValue <= 3839
    }
    
    public var isFileError: Bool {
        return rawValue >= 0 && rawValue <= 1023
    }
    
    public var isFormattingError: Bool {
        return rawValue >= 2048 && rawValue <= 2559
    }
    
    public var isPropertyListError: Bool {
        return rawValue >= 3840 && rawValue <= 4095
    }
    
    public var isUbiquitousFileError: Bool {
        return rawValue >= 4352 && rawValue <= 4607
    }
    
    public var isUserActivityError: Bool {
        return rawValue >= 4608 && rawValue <= 4863
    }
    
    public var isValidationError: Bool {
        return rawValue >= 1024 && rawValue <= 2047
    }
    
    public var isXPCConnectionError: Bool {
        return rawValue >= 4096 && rawValue <= 4224
    }
}

#if os(OSX) || os(iOS)
    import Darwin
#elseif os(Linux)
    import Glibc
#endif

internal func _NSErrorWithErrno(_ posixErrno : Int32, reading : Bool, path : String? = nil, url : NSURL? = nil, extraUserInfo : [String : Any]? = nil) -> NSError {
    var cocoaError : NSCocoaError
    if reading {
        switch posixErrno {
            case EFBIG: cocoaError = NSCocoaError.FileReadTooLargeError
            case ENOENT: cocoaError = NSCocoaError.FileReadNoSuchFileError
            case EPERM, EACCES: cocoaError = NSCocoaError.FileReadNoPermissionError
            case ENAMETOOLONG: cocoaError = NSCocoaError.FileReadUnknownError
            default: cocoaError = NSCocoaError.FileReadUnknownError
        }
    } else {
        switch posixErrno {
            case ENOENT: cocoaError = NSCocoaError.FileNoSuchFileError
            case EPERM, EACCES: cocoaError = NSCocoaError.FileWriteNoPermissionError
            case ENAMETOOLONG: cocoaError = NSCocoaError.FileWriteInvalidFileNameError
            case EDQUOT, ENOSPC: cocoaError = NSCocoaError.FileWriteOutOfSpaceError
            case EROFS: cocoaError = NSCocoaError.FileWriteVolumeReadOnlyError
            case EEXIST: cocoaError = NSCocoaError.FileWriteFileExistsError
            default: cocoaError = NSCocoaError.FileWriteUnknownError
        }
    }
    
    var userInfo = extraUserInfo ?? [String : Any]()
    if let path = path {
        userInfo[NSFilePathErrorKey] = path._nsObject
    } else if let url = url {
        userInfo[NSURLErrorKey] = url
    }
    return NSError(domain: NSCocoaErrorDomain, code: cocoaError.rawValue, userInfo: userInfo)
    
}
