;;; -*- Mode:LISP; Package:(KMC USE (LISP GLOBAL)); Base:10; Readtable:CL -*-

(in-package 'kmc :use '(LISP GLOBAL OBJ USER))

;;; macros for generating window/menu routines

(defun l-name (x)
  (intern (string-append "L-" x)))

(defmacro ask-have(var val)
  `(ask (current-obj) (have ',var ,val)))

(defun ask-have (var val)
  (list 'ask '(current-obj)
	(list 'have
	      (list 'quote var)
	      val)))

(defmacro defobj-editvars (obj label &rest alist)
  (let* ((vars (mapcar #'car alist))
	 (lvars (mapcar #'l-name vars)))
    `(defobfun (editvars ,obj) ()
       (ask (current-obj) (show-own-vals))
       (let ((abort nil)
	     ,@(mapcar #'(lambda(x) (list (l-name x) x)) vars))
	 (declare(special abort ,@lvars))
	 (catch 'abort
	   (tv:choose-variable-values
	     ',(loop for old in vars
		     for new in lvars
		     with l = alist
		     do (setf l (subst new old l))
		     finally (return l))
	     :extra-width 30
	     :margin-choices '("Exit/Save"
			       ("Abort" (throw 'abort (values nil :abort))))
	     :near-mode '(:point 400 400)
	     :label ,label)
	   ,@(mapcar #'ask-have vars lvars)
	   (ask (current-obj) (show-own-vals)))
	 ;;changes saved
	 ))))

;;; A SYSTEM is a hardware entity (the chassis)

(defkind system)

(definstancevars system
  (sys-name nil)
  (maker nil))

;;; A HOST is a software entity (the workstation)

(defkind host)

(definstancevars host
  (host-name nil)
  (nicknames nil)
  (host-type nil)
  (files-type nil)
  (my-sys-host nil)
  (mail-server nil))

;;; Unix

(defkind unix-host host)

(defclassvars unix-host
  (host-type 'unix)
  (files-type 'unix))

(defobj-editvars unix-host
	  "--- Edit UNIX host ---"
	  (host-name  "Host name"
		      :documentation "Enter the name of this host.")
	  (nicknames "Nicknames (list)"))

(defkind vax system)

(defclassvars vax
  (maker 'digital-equipment-corp))

(defkind vax-host)

(defkind vax42-host vax-host unix-host)

(defkind vaxvms-host vax-host)

(defclassvars vaxvms-host
  (host-type 'vax)
  (files-type 'vms))

;;; Lisp machines

(defkind lispm-host host)

(defclassvars lispm-host
  (host-type  'lispm)
  (files-type 'lispm))

(defobj-editvars lispm-host
	  "Edit Lisp Machine host"
	  (host-name  "Host name"
		      :documentation "Enter the name of this host.")
	  (nicknames "Nicknames (list)")
	  (my-sys-host "Remote sys host")
	  (mail-server "Remote mail server host"))

(defkind lisp-machine system)

(defkind explorer lisp-machine lispm-host)

(defclassvars explorer
  (maker 'ti))

(defkind symbolics lisp-machine lispm-host)

(defclassvars symbolics
  (files-type :lmfs))

;;; LMI machines

(defkind lambda-host lispm-host)

(defkind lambda lisp-machine)

(defclassvars lambda
  (maker 'lmi))

(definstancevars lambda
  (chassis-type 'regular)
  (excelan-p nil)
  (3com-p t)
 )

(defconst valid-lambda-chassis '(regular heavy-duty))

(defobj-editvars lambda
		 "Edit LAMBDA system info"
  (chassis-type "Chassis type" :choose #.valid-lambda-chassis)
  (excelan-p "Contains TCP/IP Interface" :boolean)
  (3com-p "Contains Chaosnet Interface"  :boolean))

(defkind lambda1 lambda)

(definstancevars lambda1
  (lisp-1 (oneof lambda-host)))

(defkind lambda2 lambda1)

(definstancevars lambda2
  (lisp-2 (oneof lambda-host)))

(defkind lambda+ lambda)

(definstancevars lambda+
  (unix-a (oneof unix-host)))

(defkind lambda2+ lambda2 lambda+)

(defkind lambda3 lambda2)

(definstancevars lambda3
  (lisp-3 (oneof lambda-host)))

