(require-library "function.ss")
(load-relative "sig.ss")
(define main@
  (let ((foldl foldl))
    (unit/sig ()
      (import top^ (fname))
      (define file-scores
	(map (lambda (name-symbol)
	       (let ([name (symbol->string name-symbol)])
		 (cons (if (file-exists? name)
			   name
			   (let* ([final (build-path "/home" name "comp210/final")]
				  [other (build-path final "connect5")]
				  [scheme (build-path final "connect5.ss")])
			     (if (file-exists? scheme)
				 scheme
				 other)))
		       0)))
	     (load fname)))
      (define (score1 result)
	(modulo (add1 result) 3)) ; 0 -> 1 tie, 1 -> 2 win, 2 -> 0 loss
      (define (score2 result)
	(- 2 (score1 result)))
      (foldl (lambda (file-score1 rest)
	       (for-each
		(lambda (file-score2)
		  (let* ([file1 (car file-score1)]
			 [file2 (car file-score2)]
			 [result1 (run file1 file2)]
			 [result2 (run file2 file1)])
		    (set-cdr! file-score1 (+ (cdr file-score1)
					     (score1 result1)
					     (score2 result2)))
		    (set-cdr! file-score2 (+ (cdr file-score2)
					     (score2 result1)
					     (score1 result2)))))
		rest)
	       (if (null? rest)
		   null
		   (cdr rest)))
	     (cdr file-scores)
	     file-scores)
      (printf "Results:~n~a" file-scores))))

(if (>= (vector-length argv) 4)
    (let* ([arg (lambda (n) (vector-ref argv n))]
	   [a0   (arg 0)]
	   [a1   (arg 1)]
	   [a2  (arg 2)]
	   [a3  (arg 3)])
      (invoke-unit/sig
       (compound-unit/sig (import)
	 (link (ARGS : bigger^ ((unit/sig bigger^ (import)
				  (define size (string->number a0))
				  (define secs (string->number a1))
				  (define quiet (string=? a2 "quiet"))
				  (define fname a3))))
	       (COM : top^ ((load-relative "common.ss") (ARGS : args^)))
	       (M : () (main@ COM (ARGS : (fname)))))
	 (export))))
    (fprintf (current-error-port) "Program expects args: board-size timeout-secs quiet names-file~n"))
(exit)
