;;; -*- Mode:LISP; Fonts:(MEDFNT); Readtable:CL; Base:10 -*-

(defkind box)

(defclassvars box down-pointer right-pointer)

(definstancevars box tag text
  (box-left-side #\|)
  (box-right-side #\|)
  (box-top  #\_)
  (box-bottom #\_))

(defkind standalone-box box)

(defkind down-box box)

(defclassvars down-box (down-pointer t))

(definstancevars down-box (down-line #\|))

(defkind right-box)

(defclassvars right-box (right-pointer t))

(definstancevars right-box (right-line #\-))

(defkind down-right-box down-box right-box)

(defclassvars down-right-box
  (down-pointer t)
  (right-pointer t))

(defconst test
	  '((chaos (label down
			  :tag "Chaos"
			  :network-id 7)
		   (it down
		       :tag "It"
		       :network-id 3741)
		   (thing down
			  :tag "Thing"
			  :network-id 3742)
		   (tish down-right
			 :tag "Morticia"
			 :network-id 3722))
	    (net1 (label down
			 :tag "Internet 101.0.0.0")
		  (tish standalone
			:network-id "101.0.0.1"))))

(defkind network-box box)

(definstancevars network-box (network-id))

(defobfun (deduce-text network-box) (&optional text-input)
  (cond
    (text-input (have 'text text-input))
    ((integerp network-id) (have 'text (format nil "#o~o" network-id)))
    ((stringp network-id) (have 'text text))
    (text t)
    (t  (have 'text ""))))

(defun make-box (kind &key tag network-id &allow-other-keys &aux this-box)
  (setq this-box (oneof network-box))
  (case kind
    (standalone (setq this-box (make-obj this-box standalone-box)))
    (down (setq this-box (make-obj this-box down-box)))
    (right (setq this-box (make-obj  this-box right-box)))
    (down-right (setq this-box (make-obj  this-box down-right-box)))
    (t (ferror nil "~s is not a box" kind)))
  (when tag (print 'got-tag) (ask this-box (have 'tag tag)))
  (when network-id (ask this-box (have 'network-id network-id)))
  (ask this-box (deduce-text))
  this-box)
