(ns anyevent-httpd

  (. require AnyEvent::HTTPD)

  (defn server [opts]
    (->AnyEvent::HTTPD new opts))

  (defn reg-cb [s opts]
    (.Object::Event reg_cb ^{:return "nil"} s opts))

  (defn respond [req o]
    (.AnyEvent::HTTPD::Request respond ^{:arguments ["scalar" "scalar"]} req o))

  (defn stop-respond [s]
    (.AnyEvent::HTTPD stop_request s))

  (defn run [s]
    (.AnyEvent::HTTPD run s))

  (defn url [req]
    (.AnyEvent::HTTPD::Request url req))

  (defn method [req]
    (perl->clj (.AnyEvent::HTTPD::Request method req)))

  (defn params [req]
    (let [ps (perl->clj (.AnyEvent::HTTPD::Request params ^{:return "ref-array"} req))]
      (reduce
        (fn [p i]
          (#:p i (perl->clj (.AnyEvent::HTTPD::Request parm req p)))
          i)
        {}
        ps)))

  (defn headers [req]
    (perl->clj (.AnyEvent::HTTPD::Request headers ^{:return "ref"} req)))

  (defn content [req]
    (perl->clj (.AnyEvent::HTTPD::Request content req)))

  (defn client-host [req]
    (perl->clj (.AnyEvent::HTTPD::Request client_host req)))

  (defn client-port [req]
    (perl->clj (.AnyEvent::HTTPD::Request client_port req)))

  (defn start-server [host-port opts]
    (let [s (server host-port)]
      (map (fn [k]
        (reg-cb s {k (fn [s req]
                       (respond req
                         {"content" ["text/html"
                                     (clj->string (#:k opts))]}))}))
        (keys opts))
      (run s)))

  )