// 构建一个简单的 HTTP 服务器,可以响应 GET 与 POST 请求,并支持 JSON 数据
import std.fs.File
import std.io.StringReader
import net.http.*
import encoding.json.*

class HttpServer {
    let server: Server
    public init(ip: String, port: UInt16) {
        server = ServerBuilder().addr(ip).port(port).build()
        println("http://${ip}:${port}")
    }

    public func route(route: String,
        callback: (req: HttpRequest, res: HttpResponseBuilder) -> Unit) {
        server.distributor.register(route, { context => 
            callback(context.request, context.responseBuilder)
        })
    }

    public func start() {
        server.serve()
    }
}

func readFile(path: String): String {
    return String.fromUtf8(File.readFrom(path))
}

main() {
    let server = HttpServer("127.0.0.1", 8080)

    // 响应 GET 请求
    server.route("/", { req, res => 
        if (req.method == "GET") {
            // 设置 http 响应头
            let Headers = HttpHeaders()
            Headers.add("Content-Type", "text/html;charset=utf-8;")
            res.setHeaders(Headers)
            // 返回读取一个 html 文件,并返回给客户端
            res.body(readFile("./index.html"))
        }
    })

    // 响应 POST 请求
    server.route("/Hello", { req, res => 
        if (req.method == "POST") {
            // 读取请求内容
            let content = StringReader(req.body).readToEnd()
            println(content)
            let object = JsonValue.fromStr(content).asObject()
            let userName = object.get('name').getOrThrow().asString().getValue()

            // 初始化一个空的 JsonObject,并添加键值和信息
            let response = JsonObject()
            response.put('code', JsonString('OK'))
            response.put('msg', JsonString("Hello ${userName}"))

            // 设置 HTTP 响应头
            let headers = HttpHeaders()
            headers.add("Content-Type", "applications/json;charset=utf-8;")
            res.setHeaders(headers)

            // 将 JsonObject 转为 Json 字符串文本,作为响应 Body
            res.body(response.toJsonString())
        }
    })
    server.start()
}