import PerfectHTTP


class HandlerContext {
	let request: HTTPRequest
	let response: HTTPResponse
	init(request: HTTPRequest, response: HTTPResponse) {
		self.request = request
		self.response = response
	}
}


protocol Endpoint: class {
	init()
	var purpose: String { get }
	func handler(context: HandlerContext) throws
}


class EP_GetDataList: Endpoint {
	required init() {}

	let purpose = "List files for a user"

	func handler(context: HandlerContext) throws {
		let userId = try context.request.userId()
		guard let jsonString = context.request.param(name: "json") else {
			throw NetworkError.custom("A 'json' parameter must be provided", .badRequest)
		}
		let json = JSON.parse(string: jsonString)
		// ... impl ...
	}
}


func installRoutes() {
	scope("/v1") {
		post("/data/upload",  EP_PostDataUpload.self)
		get ("/data/list",    EP_GetDataList.self)
		get ("/data/download",EP_GetDataDownload.self)
		get ("/data/preview", EP_GetDataPreview.self)
		get ("/type/list",    EP_GetTypeList.self)
	}
}

// Generated documentation looks like this:
//
// POST /v1/data/upload    class: EP_PostDataUpload   purpose: "Upload a file to a user"      policy: secure
// GET  /v1/data/list      class: EP_GetDataList      purpose: "List files for a user"        policy: secure
// GET  /v1/data/download  class: EP_GetDataDownload  purpose: "Download a file from a user"  policy: secure