;;;; modify.lisp

(in-package :oneliners.cli.app)

;; ol modify flag <ID>
;; ol modify unflag <ID>
;; ol modify description <ID> new description ...
;; ol modify redraft <ID>
;; ol modify name <ID> New-name
;; ol modify lock <ID>
;; ol modify unlock <ID>

(defhandler modify/redraft/handler (id)
  (ol:edit-item (parse-identifier id)))

(defun modify/redraft/command ()
  (cli:make-command
   :name "redraft"
   :usage "<identifier>"
   :description "edit an existing oneliner"
   :handler #'modify/redraft/handler))

(defhandler modify/flag/handler (id)
  (ol::flag-item (parse-identifier id)))

(defun modify/flag/command ()
  (cli:make-command
   :name "flag"
   :usage "<identifier>"
   :description "flag a oneliner as potentially wrong or hazardous"
   :handler #'modify/flag/handler))

(defhandler modify/unflag/handler (id)
  (ol::unflag-item (parse-identifier id)))

(defun modify/unflag/command ()
  (cli:make-command
   :name "unflag"
   :usage "<identifier>"
   :description "remove flagged status from a oneliner"
   :handler #'modify/unflag/handler))

(defhandler modify/lock/handler (id)
  (ol::lock-item (parse-identifier id)))

(defun modify/lock/command ()
  (cli:make-command
   :name "lock"
   :usage "<identifier>"
   :description "lock a oneliner from being changed (admin only)"
   :handler #'modify/lock/handler))

(defun modify/unlock/handler (id)
  (ol::unlock-item (parse-identifier id)))

(defun modify/unlock/command ()
  (cli:make-command
   :name "unlock"
   :usage "<identifier>"
   :description "unlock a locked oneliner, allowing it to be modified again"
   :handler #'modify/unlock/handler))

(defun modify/delete/handler (id)
  (ol::delete-item (parse-identifier id)))

(defun modify/delete/command ()
  (cli:make-command
   :name "delete"
   :usage "<identifier>"
   :description "delete a oneliner from the server."))

(defun modify/subcommands ()
  (list
   (modify/redraft/command)
   (modify/flag/command)
   (modify/unflag/command)
   (modify/lock/command)
   (modify/unlock/command)
   (modify/delete/command)))

(defun modify/handler (cmd)
  (cli:print-usage cmd t))

(defun modify/command ()
  (cli:make-command
   :name "modify"
   :description "alter an existing oneliner"
   :handler #'modify/handler
   :sub-commands (modify/subcommands)))