import Foundation

enum MessageType: UInt8 {
    
    /// The initial message from remote to device to request a challenge.
    case initial = 0
    
    /// The second message in an unlock with the challenge from the device to the remote
    case challenge = 1
    
    /// The third message with the signed challenge from the remote to the device
    case request = 2
    
    /// The final message with the unlock result from the device to the remote
    case response = 3
}

extension MessageType {

    var encoded: Data {
        Data([rawValue])
    }
}

extension MessageType: Codable {
    
}

extension MessageType {
    
    var responseType: MessageType {
        switch self {
        case .initial:
            return .challenge
        case .challenge:
            return .request
        case .request, .response:
            return .response
        }
    }
}

extension MessageType: CustomStringConvertible {
    
    var description: String {
        switch self {
        case .initial:
            return "Initial"
        case .challenge:
            return "Challenge"
        case .request:
            return "Request"
        case .response:
            return "Response"
        }
    }
}
