(defpackage #:<%= (@ sys-name) %>
  (:use #:cl #:clog)
  (:export <%= (@ sys-name) %>-element
           create-<%= (@ sys-name) %>-element
           init-<%= (@ sys-name) %>
           attach-<%= (@ sys-name) %>
           start-test))

(in-package :<%= (@ sys-name) %>)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Implementation - <%= (@ sys-name) %>-element
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defclass <%= (@ sys-name) %>-element (clog-element)()
  (:documentation "<%= (@ sys-name) %> Element Object."))

(defgeneric create-<%= (@ sys-name) %>-element (clog-obj &key hidden class html-id auto-place)
  (:documentation "Create a new <%= (@ sys-name) %>-element as child of CLOG-OBJ."))

(defmethod create-<%= (@ sys-name) %>-element ((obj clog:clog-obj)
                                         &key
                                           (hidden nil)
                                           (class nil)
                                           (html-id nil)
                                               (auto-place t))
  "Create control - used at design time and in code"
  (let ((new-obj (create-div obj
                             :class class
                             :hidden hidden
                             :html-id html-id
                             :auto-place auto-place)))
    (set-geometry new-obj :width 200 :height 100)
    (change-class new-obj '<%= (@ sys-name) %>-element)
    (attach-<%= (@ sys-name) %> new-obj)
    new-obj))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Events - <%= (@ sys-name) %>-element
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Properties - <%= (@ sys-name) %>-element
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Methods - <%= (@ sys-name) %>-element
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Implementation - js binding
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defgeneric init-<%= (@ sys-name) %> (<%= (@ sys-name) %>-element)
  (:documentation "Initialize libraries"))

(defmethod init-<%= (@ sys-name) %> ((obj <%= (@ sys-name) %>-element))
  (check-type obj clog:clog-obj)
  ;; Only init once
  ;; Use load-css for any css files to load
  ;; Use load-script for any js files to load
  )

(defgeneric attach-<%= (@ sys-name) %> (<%= (@ sys-name) %>-element)
  (:documentation "Initialize plugin"))

(defmethod attach-<%= (@ sys-name) %> ((obj <%= (@ sys-name) %>-element))
  (init-<%= (@ sys-name) %> obj))

(defun on-test-<%= (@ sys-name) %> (body)
  (clog:debug-mode body)
  ;; Use the panel-box-layout to center horizontally
  ;; and vertically our div on the screen.
  (let* ((layout (create-panel-box-layout body))
         (test   (create-<%= (@ sys-name) %>-element (center-panel layout))))
    (center-children (center-panel layout))))

(defun start-test ()
  (initialize 'on-test-<%= (@ sys-name) %>
   :static-root (merge-pathnames "./www/"
                  (asdf:system-source-directory :<%= (@ sys-name) %>)))
  (open-browser))
