#lang racket/gui

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require "Receptor.rkt")
(require "Efectores.rkt")
(require "Cerebro3.rkt")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define animat%
  (class object%
    (init-field
     (Sensores 'receptor_sensorial)
     (Efectores 'efectores)
     (control_central 'cerebro)
     )
    (field
     (tipo 3)
     (energia 0)
     (last-action #f)
     )
    (define/public set-energia
      (lambda (valor)
        (set! energia valor)
        ))
    (define/public get-energia
      (lambda ()
        energia))
    (define/public get-tipo
      (lambda ()
        tipo ))
    (define/public procesar!
      (lambda (x y lista-8vec-coord lista-8vec-obj)
        (let*-values
            ([(output_receptor) (send Sensores proceso! lista-8vec-obj)]
             [(ordinal_vec) (send control_central proceso! output_receptor last-action)]
             [(clave_acto vec_coord)
              (send Efectores proceso! ordinal_vec output_receptor lista-8vec-coord)]
             )
          (printf "Acción deseada: ~a a ~a~n" clave_acto vec_coord)
          (cond
            ((eq? clave_acto 'avanzar)
             (set! energia (sub1 energia))
             (set! last-action #f) )
            (else
             (set! energia (+ 8 energia))
             (set! last-action ordinal_vec))
            )
          (printf "Energía del sistema: ~a~n" energia)
          (values clave_acto vec_coord)
          )
        ))     
    (super-new)
    ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define A1 (make-object animat% receptor_sensorial efectores cerebro))

(provide animat% A1)