import Foundation
import CryptoKit

extension Message {

    /**
     Calculate an authentication code for the message content.
     - Parameter key: The key to use to sign the content.
     - Returns: The new message signed with the key.
     */
    func authenticate(using key: SymmetricKey) -> SignedMessage {
        let mac = HMAC<SHA256>.authenticationCode(for: encoded, using: key)
        return .init(mac: Data(mac.map { $0 }), message: self)
    }

    /**
     Calculate an authentication code for the message content and convert everything to data.
     - Parameter key: The key to use to sign the content.
     - Returns: The new message signed with the key, serialized to bytes.
     */
    func authenticateAndSerialize(using key: SymmetricKey) -> Data {
        let encoded = self.encoded
        let mac = HMAC<SHA256>.authenticationCode(for: encoded, using: key)
        return Data(mac.map { $0 }) + encoded
    }
}
