#!/usr/bin/guile -s
!#
(use-modules (ice-9 debug) (ice-9 getopt-long) (srfi srfi-2))

(define datadir "../common/")

(load (string-append datadir "bridge-book.scm"))
(load (string-append datadir "compat-telegraph.scm"))

(define cmdline (command-line))
(define progname (car cmdline))

(define (usage progname)
  (format #t "Usage:  ~A --record filename~%" progname)
  (format #t "or: ~A --play filename~%~%" progname)
  (format #t "  -h, --help     display help screen~%")
  (format #t "  -v, --version  display version information ~%")
  (format #t "  -r,--record  record bus activity to specified file~%")
  (format #t "  -p,--play replay forward commands from specified file on the bus~%~%")
  (format #t "  Report bugs to <inger@altlinux.ru>~%")
  #t)
  
(define (version progname) (format #t "~A version 1.99 ~%" progname) #t)

(define (save-and-continue addr func)
  (let* ((message (read-bus-message (current-ports)))
	(cmds (message->commands message)))
    (func cmds)
    (write-bus addr message)))

(define (bridge-book-record filename)
  (define (loop logfile)
    (read-bus-address (current-ports)
      ('>> 
       (save-and-continue
	 '>>
	 (lambda (cmdlist)
	   (bridge-book-log-forward logfile cmdlist))))
      ('<< 
       (save-and-continue
	 '<<
	 (lambda(cmdlist)
	   (bridge-book-log-backward logfile cmdlist)))))
    (loop logfile))
  (call-with-output-file
    filename
    (lambda (logfile)
      (bridge-book-write-timestamp logfile)
      (loop logfile))))

(define option-spec
  '((version (single-char #\v) (value #f))
    (help    (single-char #\h) (value #f))
    (record  (single-char #\r) (value #t))
    (play    (single-char #\p) (value #t))))

(define options (getopt-long cmdline option-spec))

(and (option-ref options 'help #f) (usage progname) (quit))
(and (option-ref options 'version #f) (version progname) (quit))


(and-let* ((record-file (option-ref options 'record #f)))
	  (bridge-book-record record-file)
	  (quit))
(and-let* ((play-file (option-ref options 'play #f)))
	  (bridge-book-play play-file
			    (lambda (cmd)
			      (write-bus '>> (commands->message (list cmd)))
			      (read-bus '<<)))
	  (write-line exit-address)
	  (quit))

(usage progname)
(quit)

