#lang racket

(define decision
  (lambda (d_visual d_tactil anal_olfativo energia)
    (let ((sensor_e (sensor_energia energia)) )
      (case sensor_e
        ((0) (cons 0 d_visual))
        ((1) (analisis_tactil_1 d_visual d_tactil))
        ((2) (analisis_tactil_2 d_visual d_tactil anal_olfativo))
        (else (printf "else"))
        )
      )
    ))

(define sensor_energia
  (lambda (energia)
    (cond
      ((>= energia 100) 0)
      ((and (< energia 100) (> energia 0)) 1)
      ((and (<= energia 0) (> energia -200)) 2)
      ((<= energia -200) #f)
      )
    ))

(define analisis_tactil_1
  (lambda (d_visual d_tactil)
    (if (member 1 d_tactil)
        (cons 1 d_tactil)
        (cons 0 d_visual))
    ))

(define analisis_tactil_2
  (lambda (d_visual d_tactil anal_olfativo)
    (cond
      ((member 1 d_tactil) (cons 1 d_tactil))
      ((member 1 anal_olfativo) (accion_segun_olfato anal_olfativo d_visual))
      (else (cons 0 d_visual))
      )
    ))

(define accion_segun_olfato
  (lambda (anal-olfativo d-visual)
    (letrec ((segun_olfato
              (lambda (anal_olfativo)
                (let go ((i 0)
                         (j (length anal_olfativo))
                         (salida '())
                         )
                  (if (= i j)
                      salida
                      (if (= (list-ref anal_olfativo i) 1)
                          (go (add1 i) j (cons i salida))
                          (go (add1 i) j salida))
                      )
                  )
                ))
             (to_accion_segun_olfato
              (lambda (orden)
                (case orden
                  ((3) '(0 0 0 0));;girar-dcha
                  ((4) '(0 0 0 0))
                  ((5) '(0 0 0 0))
                  ((6) '(1 0 0 0));;girar-izqda
                  ((7) '(1 0 0 0))
                  )
                ))
             (aux
              (lambda (lista_posiciones d_visual)
                (if (null? lista_posiciones)
                    (cons 0 d_visual)
                    (if (< (car lista_posiciones) 3)
                        (aux (cdr lista_posiciones) d_visual)
                        (to_accion_segun_olfato (car lista_posiciones))
                        )
                    )
                ))
             )
      (aux (segun_olfato anal-olfativo) d-visual)
      )
    ))

(provide decision)