#lang racket/gui

;(require "Entorno-0.rkt")
(require "Entorno-1.rkt")
;(require "Entorno-2.rkt")
;;(require "Entorno-3.rkt")
;(require "Entorno-celular.rkt")
;;;;;;;;;;;;;;
(define filas 49)
(define columnas 49)
(define radio 10)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LAS FUNCIONES DE DIBUJO
;;; LAS HERRAMIENTAS GRÁFICAS
;;; PROCEDIMIENTOS DE DIBUJO
(define pinta-una-fila
  (lambda (output x y hoffset)
    (cond
      ((null? output) )
      (else
       (let* ((tipo (send (car output) get-tipo))
              (color 
               (cond
                 ((= tipo 0) (make-object color% 255 255 255 1.0))
                 ((= tipo 1) (make-object color% 0 0 255 1.0))
                 ((= tipo 2) (make-object color% 0 255 0 1.0))
                 ((= tipo 3) (make-object color% 255 0 0 1.0))
                 ))
              (pen 
               (make-object pen%
                 "lightgray";color;(car output)
                 1
                 'solid
                 ))
              (brush 
               (make-object brush%
                 color;(car output)
                 'solid
                 ))
              )
         (send dc set-pen pen)
         (send dc set-brush brush)
         (send dc draw-rectangle x y radio radio)
         (pinta-una-fila (cdr output) (+ x hoffset) y hoffset)) )
      ) 
    ))
(define pinta-configuracion
  (lambda (configuracion)
    (do
        ((voffset radio (+ voffset radio))
         (i 1 (add1 i))
         (config configuracion (cdr config))
         )
      ((null? config) #t)
      (pinta-una-fila
       (car config)
       4 voffset radio)
      )
    ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define dibujo
  (lambda (dc)
    (pinta-configuracion (send M get-configuracion))
    ))
;;; La ventana
(define ventana
  (make-object frame% 
    "Monitor de Animat. Aprendizaje por Refuerzo" 
    #f 
    (+ 10 (* radio (add1 columnas))) (* radio (+ 10 filas))
    1200 0))
;;; El lienzo
(define lienzo
  (instantiate canvas%
    (ventana)
    (style '(border))
    (paint-callback
     (lambda (lienzo dc) (dibujo dc)))
    ))
(define dc (send lienzo get-dc))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define driver
  (lambda (dc)
    (let go ((i 0)
             (j 450)
             )
      (if (= i j)
          #t
          (begin
            (dibujo dc)
            (send M procesar! i)
            (sleep/yield (/ 1 10));(/ 1 columnas) 0.2)
            (go (add1 i) j)
            )
          )
      )
    ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(send ventana show #t)
(sleep/yield 1)


(let ((historia-energia #f)
      (base_c-fuerza #f)
      (base_c-clases #f)
      )
  (driver dc)
  (set! historia-energia 
        (send A1 get-historia-energia))
  (set! base_c-fuerza (send A1 get-bc))
  (set! base_c-clases (send A1 get-BC))
  
  (printf "Energía promedio: ~a~n" (exact->inexact (/ (apply + historia-energia) (length historia-energia))))
  (printf "Cardinal A-set: ~a~n" (length (filter-map (lambda (k) k) base_c-clases)))
  (printf "Cardinal BC: ~a~n" (length base_c-fuerza))
  (values
   base_c-fuerza
   base_c-clases
   ))
(define latex-puntos (take (reverse (send A1 get-puntos-latex)) 20));(reverse (send A1 get-puntos-latex)));
(define latex-par (send A1 get-pares-latex))
  

