#lang racket/gui

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require "Receptores-sensitivos.rkt")
(require "Cerebro.rkt")
(require "Efectores.rkt")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define animat%
  (class object%
    (init-field
     (Energia 100)
     (Retina 'retina)
     (Tacto 'tacto)
     (Olfato 'olfato)
     (Efectores 'efectores)
     (control_central 'cerebro)
     (color 'obj_color);(make-object color% 255 0 0 1.0))
     (estado 1)
     )
    (field
     (orientacion 'N)
     (accion 'avanzar)
     )
    (define/public get-estado
      (lambda ()
        estado))
    ;
    (define/public set-energia
      (lambda (v)
        (set! Energia (- Energia v))
        ))
    ;;
    (define/public exito
      (lambda (arg)
        (send control_central exito! arg)
        ;#t
        ))
    (define/public set-rgb
      (lambda (r v a o)
        (set! color
              (make-object color% r v a o)
              )
        ))
    (define/public get-rgb
      (lambda ()
        (let ((r (send color red))
              (g (send color green))
              (b (send color blue))
              (o (send color alpha))
              )
          (list r g b o)
          )
        ))
    (define/public get-color
      (lambda ()
        color ))
    (define es-de-color?
      (lambda (rgb-obj esquema)
        (equal? rgb-obj esquema)
        ))
    (define/public get-orientacion
      (lambda ()
        orientacion ))
    (define/public get-accion
      (lambda ()
        accion ))
    (define son-estimulos
      (lambda (e1 e2 e3 e4 e5 e6 e7 e8 orientacion)
        (cond
          ((eq? orientacion 'N) (values e1 e2 e3))
          ((eq? orientacion 'E) (values e3 e4 e5))
          ((eq? orientacion 'S) (values e5 e6 e7))
          ((eq? orientacion 'O) (values e7 e8 e1))
          )
        ))
    (define/public procesar!
      (lambda (x y lista-8vec-coord lista-8vec-obj)
        (let*-values
            ([(v1 v2 v3 v4 v5 v6 v7 v8) (apply values lista-8vec-coord)]
             [(o1 o2 o3 o4 o5 o6 o7 o8) (apply values lista-8vec-obj)]
             [(v_1 v_2 v_3) (son-estimulos v1 v2 v3 v4 v5 v6 v7 v8 orientacion)]
             [(obj_1 obj_2 obj_3) (son-estimulos o1 o2 o3 o4 o5 o6 o7 o8 orientacion)]
             [(output_retina) (send Retina proceso! (list obj_1 obj_2 obj_3))]
             [(output_sensores_tacto) (send Tacto proceso! (list obj_1 obj_2 obj_3))]
             [(output_sensores_olfato) (send Olfato proceso! (list o1 o2 o3 o4 o5 o6 o7 o8))]
             
             [(orden_motora) (send control_central proceso! output_retina output_sensores_tacto output_sensores_olfato Energia)]
             [(accion c_1 c_2) (send Efectores hacer! orden_motora (cons x y) (list v_1 v_2 v_3))]
             )
          ;(printf "Lo visto: ~a Lo tocado: ~a Lo olfateado: ~a~n" output_retina output_sensores_tacto output_sensores_olfato)
          ;(printf "Orden_motora: ~a~n" orden_motora)
          (cond
            ((eq? accion 'avanzar)
             (set! accion 'avanzar)
             (set! Energia (- Energia 1))
             (printf "Acción: ~a hacia ~a. Energía: ~a~n" accion orientacion Energia)
             )
            ((eq? accion 'comer)
             (set! accion 'comer)
             (set! Energia (+ Energia 5));10;20);(* Energia -1))
             (printf "Acción: ~a hacia ~a. Energía: ~a~n" accion orientacion Energia)
             ;(sleep/yield 2)
             )
            ((eq? accion 'empujar)
             (set! accion 'EMPUJAR)
             (set! Energia (- Energia 3))
             (printf "Acción: ~a hacia ~a ~a. Energía: ~a~n" accion orientacion c_1 Energia)
             )
            ((eq? accion 'girar)
             (set! orientacion c_1)
             (set! accion 'girar)
             (set! Energia (- Energia 1))
             (printf "Acción: ~a hacia ~a. Energía: ~a~n" accion orientacion Energia)
             )
            )
;          (if (= sensor 1)
;              (sleep/yield 3/4)
;              (sleep/yield 1/50)
;              )
          (values accion c_1 c_2)
          )
        ))        
    (super-new)
    ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define A1 (make-object animat% 150 retina tacto olfato efectores cerebro (make-object color% 255 0 0 1.0)));215 0;255 0 255 1.0
;(define A2 (make-object animat% retina locomotor cerebro_vision (make-object color% 255 0 0 1.0)))

(provide animat% A1)

