import Foundation
import Vapor

enum HeaderKey: String {
    case name
    case password
    case email
    case token
    case visibility
    case action
}

extension Request {

    /**
     Get a header for a key, or abort with a `badRequest`.
     */
    func header(_ key: HeaderKey) throws -> String {
        guard let value = headers.first(name: key.rawValue) else {
            throw Abort(.badRequest)
        }
        return value
    }

    func optionalHeader(_ key: HeaderKey) -> String? {
        headers.first(name: key.rawValue)
    }

    /**
     Get the password from the request header and hash it.

     Possible error responses:
     - `400`: No password header found
     - `424`: Failed to hash the password
     */
    func hashedPassword() throws -> String {
        let password = try header(.password)
        guard let hash = try? self.password.hash(password) else {
            throw Abort(.failedDependency) // 424
        }
        return hash
    }
}
