(use-modules (alterator http template)
             (alterator http html)
	     (alterator str)

             (alterator configd html)
             (alterator configd woo)
             (alterator configd form)
             (alterator configd constraints)
             (alterator configd frontend))

(define (make-menu-item item)
  (cons (string-sure-slash (woo-get-option item 'name))
	(woo-get-option item 'help)))

(define (menu-item=? url)
  (let ((url (string-sure-slash url)))
    (lambda (x)
      (and (string-prefix? (car x) url) (cdr x)))))

(define *menu-items* (append-map (lambda (group)
				  (map make-menu-item
				       (woo-list (string-append "/menu/" group) 'ui "html")))
				(woo-list-names "/menu" 'ui "html")))

(define (main-args url url-args)
  (let ((args (woo-args url url-args)))
    (or (find (lambda(arg) (string=? url (car arg))) args)
        (car (woo-args url (list  (assoc "language" url-args)))))))

(define (help-name/template url)
  (woo-catch
   (thunk  (cond-assq 'help (woo-template url)))
   (lambda args #f)))

(define (help-name/menu url)
   (any (menu-item=? url) *menu-items*))

(define (help-name url)
   (or (help-name/template url)
       (help-name/menu url)
       "notfound"))

(define (help-path url url-args)
   (let ((langlist (cond-assoc "language" url-args '("en_US"))))
          (woo-get-option (woo-read-first (string-append "/help/" (help-name url))
					  'language langlist)
			  'path)))

(define (help url url-args)
  (template (help-path url url-args)
            (apply fill-constraints "write" (main-args url url-args))))

(lambda (self objects options)
  (list
   'scm
   (help (string-join (or (cond-cdr objects) '()) "/")
         (cond-plistq 'url-args options))))
