import Foundation

/**
 A result from sending a key to the device.
 */
enum MessageResult: UInt8 {

    /// Text content was received, although binary data was expected
    case textReceived = 1

    /// A socket event on the device was unexpected (not binary data)
    case unexpectedSocketEvent = 2

    /// The size of the payload (i.e. message) was invalid, or the data could not be read
    case invalidMessageData = 3

    /// The transmitted message could not be authenticated using the key
    case messageAuthenticationFailed = 4

    /// The message time was not within the acceptable bounds
    case messageTimeMismatch = 5

    /// A later key has been used, invalidating this key (to prevent replay attacks after blocked communication)
    case messageCounterInvalid = 6

    /// The key was accepted by the device, and the door will be opened
    case messageAccepted = 7


    /// The request did not contain body data with the key
    case noBodyData = 10

    /// The device is not connected
    case deviceNotConnected = 12

    /// The device did not respond within the timeout
    case deviceTimedOut = 13

    /// Another message is being processed by the device
    case operationInProgress = 14

    /// The device is connected
    case deviceConnected = 15
}

extension MessageResult: CustomStringConvertible {

    var description: String {
        switch self {
        case .textReceived:
            return "The device received unexpected text"
        case .unexpectedSocketEvent:
            return "Unexpected socket event for the device"
        case .invalidMessageData:
            return "Invalid message data"
        case .messageAuthenticationFailed:
            return "Message authentication failed"
        case .messageTimeMismatch:
            return "Message time invalid"
        case .messageCounterInvalid:
            return "Message counter invalid"
        case .messageAccepted:
            return "Message accepted"
        case .noBodyData:
            return "No body data included in the request"
        case .deviceNotConnected:
            return "Device not connected"
        case .deviceTimedOut:
            return "The device did not respond"
        case .operationInProgress:
            return "Another operation is in progress"
        case .deviceConnected:
            return "The device is connected"
        }
    }
}
