#lang racket/gui

(define efector%
  (class object%
    (field
     (hacia 'N)
     )
    (define avanza
      (lambda (mi_c vec)
        (values
         'avanzar vec mi_c)
        ))
    (define empujar
      (lambda (vec)
        (values
         'empujar vec hacia)
        ))
    (define comer
      (lambda (vec)
        (values
         'comer vec #f)
        ))
    (define gira-izqda
      (lambda (g)
        (set! hacia
              (cond
                ((eq? hacia 'N) 'O)
                ((eq? hacia 'O) 'S)
                ((eq? hacia 'S) 'E)
                ((eq? hacia 'E) 'N)
                ))
        (values
         'girar hacia g)
        ))
    (define gira-dcha
      (lambda (g)
        (set! hacia
              (cond
                ((eq? hacia 'N) 'E)
                ((eq? hacia 'E) 'S)
                ((eq? hacia 'S) 'O)
                ((eq? hacia 'O) 'N)
                ))
        (values
         'girar hacia g)
        ))
    (define/public hacer!
      (lambda (orden mi-coord vecinos)
        (let ((caso
               (lambda (lista orden)
                 (andmap
                  (lambda (e a)
                    (= e a))
                  lista
                  orden)
                 ))
              )
          (cond
            ((caso '(1 0 0 0) orden)
             (avanza mi-coord (list-ref vecinos 0))
             )
            ((caso '(0 1 0 0) orden)
             (avanza mi-coord (list-ref vecinos 1))
             )
            ((caso '(0 0 1 0) orden)
             (avanza mi-coord (list-ref vecinos 2))
             )
            ((caso '(0 0 0 1) orden)
             (gira-dcha 1)
             ;si se comenta la línea anterior y se quita el punto y coma de la siguiente, Animat falla en algunas situaciones
             ;(avanza mi-coord (list-ref vecinos 1))
             )
            (else (printf "Fallo~n"))
            )
          )
        ))
    (super-new)
    ))

(define efectores (make-object efector%))

(provide efectores)