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

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

(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 (form url action url-args template-args)
  (let ((redirect (cond-assq 'redirect template-args url))
        (url-redirect (cond-assoc 'url-redirect template-args #f))
        (async (cond-assoc "async" url-args)))
    (cond
     (url-redirect
      (html:redirect url-redirect))
     ((string=? action "read")
      (let ((args (main-args url url-args)))
        (template (design-path (cond-assoc 'url template-args "form-unknown.html"))
                  (apply fill-constraints "write" args)
                  (apply fill-form args))))
     (else
      (for-each
       (lambda(cmd)
         (apply (if (string=? action "delete") woo-try woo-try/constraints)
                action cmd))
       (woo-args url url-args))
      (if (or (not redirect) async)
          (form url "read" url-args template-args)
          (html:redirect redirect))))))

(lambda (self objects options)
  (list
   'scm
   (form (string-append "/" (string-join objects "/"))
         (cond-plistq 'action options)
         (cond-plistq 'url-args options)
         (cond-plistq 'template-args options))))
