#lang racket/gui

(require (only-in "Objetos.rkt" olor%))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require "Receptores.rkt")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require "SNervioso1.rkt")
(require "SNervioso2.rkt")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require "Efectores2.rkt")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define hormiga%
  (class object%
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    
    (init-field
     (id 'nombre)
     (Tacto 'tacto)
     (Olfato 'olfato)
     (Efectores 'efectores)
     (Control_Central 'cerebro)
     (color 'obj_color);(make-object color% 0 0 0 1.0))Negro
     (estado 3)
     )
    (field
     (orientacion 'N)
     (comida #f);;o bien objeto amarillo
     (feromona (make-object olor% 1 30))
     (home (list (cons 44 34) (cons 44 33) (cons 44 32)))
     (dureza 6)
     (olor (make-object olor% 4 1))
     )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (define/public set-home
      (lambda (lista)
        (set! home lista)
        ))
    (define/public get-id
      (lambda ()
        id ))
    (define/public get-olor
      (lambda ()
        olor ))
    (define/public get-dureza
      (lambda ()
        dureza ))
    (define/public get-estado
      (lambda ()
        estado))
    (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/public get-orientacion
      (lambda ()
        orientacion ))
    (define son-estimulos
      (lambda (orientacion lista-8vec)
        (let*-values 
            ([(NO N NE E SE S SO O) (apply values (list 0 1 2 3 4 5 6 7))]
             [(lista-indices)
              (cond
                ((eq? orientacion 'N) (list O NO N NE E))
                ((eq? orientacion 'NE) (list NO N NE E SE))
                ((eq? orientacion 'E) (list N NE E SE S))
                ((eq? orientacion 'SE) (list NE E SE S SO))
                ((eq? orientacion 'S) (list E SE S SO O))
                ((eq? orientacion 'SO) (list SE S SO O NO))
                ((eq? orientacion 'O) (list S SO O NO N))
                ((eq? orientacion 'NO) (list SO O NO N NE))
                )]
             )
          (map
           (lambda (indice)
              (list-ref lista-8vec indice)
             )
           lista-indices)
          )
        ))
    (define/public set-comida
      (lambda (obj)
        (set! comida obj)
        ))
    (define set-orientacion
      (lambda (hacia)
        (set! orientacion hacia)
        (send Control_Central set-orientacion hacia)
        ))
    (define/public procesar!
      (lambda (x y lista-8vec-coord lista-8vec-obj lista-8vec-olor)
;        (printf "orientación ~a ~a ~a~n" orientacion lista-8vec-coord lista-8vec-obj)
        (if (and (member (cons x y) home) (eq? 'regresar (send Control_Central get-objetivo))) 
            (values 'stop #f (cons x y))
            
            (let*-values
                ([(v1 v2 v3 v4 v5) (apply values (son-estimulos orientacion lista-8vec-coord))]
                 [(o1 o2 o3 o4 o5) (apply values (son-estimulos orientacion lista-8vec-obj))]
                 [(ol1 ol2 ol3 ol4 ol5) (apply values (son-estimulos orientacion lista-8vec-olor))]
                 [(output_sensores_tacto) (send Tacto proceso! (list o1 o2 o3 o4 o5))]
                 [(output_sensores_olfato) (send Olfato proceso! (list ol1 ol2 ol3 ol4 ol5))]
                 [(lista_fero orden pre_tacto pre_olfato) (send Control_Central proceso! output_sensores_tacto output_sensores_olfato (list ol1 ol2 ol3 ol4 ol5) (list v1 v2 v3 v4 v5))]
                 [(accion coord_vec mi_coord) (send Efectores hacer! orden (cons x y) (list v1 v2 v3 v4 v5))]
                 [(objetivo) (send Control_Central get-objetivo)]
                 )
              (set-orientacion (send Efectores get-hacia))
              (printf "Receptores:~n~a~n~a~n" output_sensores_tacto output_sensores_olfato)
              (printf "Sistema nervioso Discriminación_tacto: ~a Discriminación_olfato: ~a~n" pre_tacto pre_olfato)
              (when (eq? accion 'avanzar-segun-feromona) (printf "Sistema nervioso Detectadas feromonas: ~a~n" lista_fero))
              (when (eq? objetivo 'buscar)
                (cond
                  ((eq? accion 'ceder-sitio) 
                   (set! accion 'avanzar))
                  ((eq? accion 'avanzar-al-blanco) 
                   (set! accion 'avanzar))
                  ((eq? accion 'avanzar-segun-feromona)
                   (set! accion 'avanzar))
                  ((eq? accion 'recoger-comida)
                   (send Control_Central set-objetivo 'regresar)
                   )
                  )
                )
              (when (eq? objetivo 'regresar)
                (cond
                  ((eq? accion 'avanzar-al-blanco) 
                   (set! accion 'avanzar+feromona))
                  ((eq? accion 'avanzar-segun-feromona)
                   (set! accion 'avanzar+feromona))
                  )
                )
              (printf "Sistema nervioso Objetivo: ~a Orientacion: ~a Orden: ~a~n" objetivo orientacion orden)
              (printf "Efectores Acción: ~a ~a ~a~n" accion coord_vec mi_coord)
              (values accion coord_vec mi_coord)
              )
            )
        ))        
    (super-new)
    ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define H1 (make-object hormiga% 'H1 tacto1 olfato1 efectores1 C1 (make-object color% 0 0 0 1.0)))
(define H2 (make-object hormiga% 'H2 tacto2 olfato2 efectores2 C2 (make-object color% 0 0 0 1.0)))
(define H3 (make-object hormiga% 'H3 tacto3 olfato3 efectores3 C3 (make-object color% 0 0 0 1.0)))
(define H4 (make-object hormiga% 'H4 tacto4 olfato4 efectores4 C4 (make-object color% 0 0 0 1.0)))
(define H5 (make-object hormiga% 'H5 tacto5 olfato5 efectores5 C5 (make-object color% 0 0 0 1.0)))
(define H6 (make-object hormiga% 'H6 tacto6 olfato6 efectores6 C6 (make-object color% 0 0 0 1.0)))
(define H7 (make-object hormiga% 'H7 tacto7 olfato7 efectores7 C7 (make-object color% 0 0 0 1.0)))
(define H8 (make-object hormiga% 'H8 tacto8 olfato8 efectores8 C8 (make-object color% 0 0 0 1.0)))
(define H9 (make-object hormiga% 'H9 tacto9 olfato9 efectores9 C9 (make-object color% 0 0 0 1.0)))
(define H10 (make-object hormiga% 'H10 tacto10 olfato10 efectores10 C10 (make-object color% 0 0 0 1.0)))
(define H11 (make-object hormiga% 'H11 tacto11 olfato11 efectores11 C11 (make-object color% 0 0 0 1.0)))
(define H12 (make-object hormiga% 'H12 tacto12 olfato12 efectores12 C12 (make-object color% 0 0 0 1.0)))
(define H13 (make-object hormiga% 'H13 tacto13 olfato13 efectores13 C13 (make-object color% 0 0 0 1.0)))
(define H14 (make-object hormiga% 'H14 tacto14 olfato14 efectores14 C14 (make-object color% 0 0 0 1.0)))
(define H15 (make-object hormiga% 'H15 tacto15 olfato15 efectores15 C15 (make-object color% 0 0 0 1.0)))
(define H16 (make-object hormiga% 'H16 tacto16 olfato16 efectores16 C16 (make-object color% 0 0 0 1.0)))
(define H17 (make-object hormiga% 'H17 tacto17 olfato17 efectores17 C17 (make-object color% 0 0 0 1.0)))
(define H18 (make-object hormiga% 'H18 tacto18 olfato18 efectores18 C18 (make-object color% 0 0 0 1.0)))
(define H19 (make-object hormiga% 'H19 tacto19 olfato19 efectores19 C19 (make-object color% 0 0 0 1.0)))
(define H20 (make-object hormiga% 'H20 tacto20 olfato20 efectores20 C20 (make-object color% 0 0 0 1.0)))
(define H21 (make-object hormiga% 'H21 tacto21 olfato21 efectores21 C21 (make-object color% 0 0 0 1.0)))
(define H22 (make-object hormiga% 'H22 tacto22 olfato22 efectores22 C22 (make-object color% 0 0 0 1.0)))
(define H23 (make-object hormiga% 'H23 tacto23 olfato23 efectores23 C23 (make-object color% 0 0 0 1.0)))
(define H24 (make-object hormiga% 'H24 tacto24 olfato24 efectores24 C24 (make-object color% 0 0 0 1.0)))
(define H25 (make-object hormiga% 'H25 tacto25 olfato25 efectores25 C25 (make-object color% 0 0 0 1.0)))
(define H26 (make-object hormiga% 'H26 tacto26 olfato26 efectores26 C26 (make-object color% 0 0 0 1.0)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(provide hormiga% H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23 H24 H25 H26)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

