#lang racket/gui

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require "Receptores-sensitivosB.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 h1 h2 h3 h4 h5 h6 h7 h8 h9 h10 h11 h12 h13 h14 h15 h16 orientacion)
        (cond
          ((eq? orientacion 'N) (values e1 e2 e3 h1 h2 h3 h4 h5))
          ((eq? orientacion 'E) (values e3 e4 e5 h5 h6 h7 h8 h9))
          ((eq? orientacion 'S) (values e5 e6 e7 h9 h10 h11 h12 h13))
          ((eq? orientacion 'O) (values e7 e8 e1 h13 h14 h15 h16 h1))
          )
        ))
    (define/public procesar!
      (lambda (x y lista-8vec-coord lista-8vec-obj horiz-coord horiz-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)]
             [(p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16) (apply values horiz-coord)]
             [(obj-p1 obj-p2 obj-p3 obj-p4 obj-p5 obj-p6 obj-p7 obj-p8 obj-p9 obj-p10 obj-p11 obj-p12 obj-p13 obj-p14 obj-p15 obj-p16)
              (apply values horiz-obj)]
             [(v_1 v_2 v_3 h_1 h_2 h_3 h_4 h_5) (son-estimulos v1 v2 v3 v4 v5 v6 v7 v8 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 orientacion)]
             [(obj_1 obj_2 obj_3 ho_1 ho_2 ho_3 ho_4 ho_5) 
              (son-estimulos 
               o1 o2 o3 o4 o5 o6 o7 o8 
               obj-p1 obj-p2 obj-p3 obj-p4 obj-p5 obj-p6 obj-p7 obj-p8 obj-p9 obj-p10 obj-p11 obj-p12 obj-p13 obj-p14 obj-p15 obj-p16 
               orientacion)]
             [(output_retina) (send Retina proceso! (list obj_1 obj_2 obj_3 ho_1 ho_2 ho_3 ho_4 ho_5))]
             [(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)

(require "Objetos.rkt")
;
;(send A1 procesar! 2 10 (list (cons 1 9) (cons 1 10) (cons 1 11)) (list blanco verde azul))
;
;(send A1 procesar! 2 10 (list (cons 1 9) (cons 1 10) (cons 1 11)) (list negro verde azul))
;
;(send A1 procesar! 2 10 (list (cons 1 9) (cons 1 10) (cons 1 11)) (list blanco verde blanco))
;
;(send A1 set-energia 52)
;
;(send A1 procesar! 2 10 (list (cons 1 9) (cons 1 10) (cons 1 11)) (list negro verde azul))
;
;(send A1 set-energia 2)
;
;(send A1 procesar! 2 10 (list (cons 1 9) (cons 1 10) (cons 1 11)) (list blanco verde blanco))

