#lang racket

(define efector-exploradora%
  (class object%
    (field
     (hacia 'N)
     (anterior-orientacion #f)
     )
    (define/public get-hacia
      (lambda ()
        hacia ))
    (define/public hacer!
      (lambda (orden mi-coord vecinos-coord)
        (cond
          ((equal? orden '(0 _ 2 _ _))
           (ceder-sitio mi-coord (list-ref vecinos-coord 0))
           )
          ((equal? orden '(_ _ 2 _ 0))
           (ceder-sitio mi-coord (list-ref vecinos-coord 4))
           )
          ((equal? orden '(_ 0 2 _ _))
           (ceder-sitio mi-coord (list-ref vecinos-coord 1))
           )
          ((equal? orden '(_ _ 2 0 _))
           (ceder-sitio mi-coord (list-ref vecinos-coord 3))
           )
          ((equal? orden '(1 _ _ _ _))
           (recoger-comida mi-coord (list-ref vecinos-coord 0))
           )
          ((equal? orden '(_ 1 _ _ _))
           (recoger-comida mi-coord (list-ref vecinos-coord 1))
           )
          ((equal? orden '(_ _ 1 _ _))
           (recoger-comida mi-coord (list-ref vecinos-coord 2))
           )
          ((equal? orden '(_ _ _ 1 _))
           (recoger-comida mi-coord (list-ref vecinos-coord 3))
           )
          ((equal? orden '(_ _ _ _ 1))
           (recoger-comida mi-coord (list-ref vecinos-coord 4))
           )
          ((equal? orden '(1/2 _ _ _ _))
           (avanzar 'avanzar-segun-feromona mi-coord (list-ref vecinos-coord 0) 0)
           )
          ((equal? orden '(_ 1/2 _ _ _))
           (avanzar 'avanzar-segun-feromona mi-coord (list-ref vecinos-coord 1) 1)
           )
          ((equal? orden '(_ _ 1/2 _ _))
           (avanzar 'avanzar-segun-feromona mi-coord (list-ref vecinos-coord 2) 2)
           )
          ((equal? orden '(_ _ _ 1/2 _))
           (avanzar 'avanzar-segun-feromona mi-coord (list-ref vecinos-coord 3) 3)
           )
          ((equal? orden '(_ _ _ _ 1/2))
           (avanzar 'avanzar-segun-feromona mi-coord (list-ref vecinos-coord 4) 4)
           )
          ((equal? orden '(0 _ _ _ _))
           (avanzar 'avanzar-al-blanco mi-coord (list-ref vecinos-coord 0) 0)
           )
          ((equal? orden '(_ 0 _ _ _))
           (avanzar 'avanzar-al-blanco mi-coord (list-ref vecinos-coord 1) 1)
           )
          ((equal? orden '(_ _ 0 _ _))
           (avanzar 'avanzar-al-blanco mi-coord (list-ref vecinos-coord 2) 2)
           )
          ((equal? orden '(_ _ _ 0 _))
           (avanzar 'avanzar-al-blanco mi-coord (list-ref vecinos-coord 3) 3)
           )
          ((equal? orden '(_ _ _ _ 0))
           (avanzar 'avanzar-al-blanco mi-coord (list-ref vecinos-coord 4) 4)
           )
          ((equal? orden '(-1 -1 -1 -1 -1))
           (girar-45)
           )
          ((equal? orden '(-2 -2 -2 -2 -2))
           (pararse)
           )
          (else "FALLO EFECTORES")
          )
        ))
    (define pararse
      (lambda ()
        (values 'parar #f #f)
        ))
    (define ceder-sitio
      (lambda (mi-coord coord-vec)
        (set! anterior-orientacion hacia)
        (values 'ceder-sitio coord-vec mi-coord)
        ))
    (define girar-45
      (lambda ()
        (set!
         hacia
         (cond
           ((eq? hacia 'N) 'NE)
           ((eq? hacia 'NE) 'E)
           ((eq? hacia 'E) 'SE)
           ((eq? hacia 'SE) 'S)
           ((eq? hacia 'S) 'SO)
           ((eq? hacia 'SO) 'O)
           ((eq? hacia 'O) 'NO)
           ((eq? hacia 'NO) 'N)
           ))
        (values 'girar #f #f)
        ))
    (define set-hacia
      (lambda (vec-index)
        (let ((orientaciones
               (cond
                 ((eq? hacia 'N) '(O NO N NE E))
                 ((eq? hacia 'NE) '(NO N NE E SE))
                 ((eq? hacia 'E) '(N NE E SE S))
                 ((eq? hacia 'SE) '(NE E SE S SO))
                 ((eq? hacia 'S) '(E SE S SO O))
                 ((eq? hacia 'SO) '(SE S SO O NO))
                 ((eq? hacia 'O) '(S SO O NO N))
                 ((eq? hacia 'NO) '(SO O NO N NE))
                 ))
              )
          (list-ref orientaciones vec-index)
          )
        ))
    (define avanzar
      (lambda (mensaje mi-coord coord-vec vec-index)
        (set! hacia
              (if anterior-orientacion
                  (begin0
                    anterior-orientacion
                    (set! anterior-orientacion #f)
                    )
                  (set-hacia vec-index)
                  )
              )
;        (set! hacia (set-hacia vec-index))
        (values
         mensaje
         coord-vec
         mi-coord)
        ))
    (define recoger-comida
      (lambda (mi-coord coord-vec)
        (set!
         hacia
         (cond
           ((eq? hacia 'N) 'S)
           ((eq? hacia 'NE) 'SO)
           ((eq? hacia 'E) 'O)
           ((eq? hacia 'SE) 'NO)
           ((eq? hacia 'S) 'N)
           ((eq? hacia 'SO) 'NE)
           ((eq? hacia 'O) 'E)
           ((eq? hacia 'NO) 'SE)
           ))
        (values
         'recoger-comida
         coord-vec
         mi-coord)
        ))
    (super-new)
    ))
(define efectores1 (make-object efector-exploradora%))
(define efectores2 (make-object efector-exploradora%))
(define efectores3 (make-object efector-exploradora%))
(define efectores4 (make-object efector-exploradora%))
(define efectores5 (make-object efector-exploradora%))
(define efectores6 (make-object efector-exploradora%))
(define efectores7 (make-object efector-exploradora%))
(define efectores8 (make-object efector-exploradora%))
(define efectores9 (make-object efector-exploradora%))
(define efectores10 (make-object efector-exploradora%))
(define efectores11 (make-object efector-exploradora%))
(define efectores12 (make-object efector-exploradora%))
(define efectores13 (make-object efector-exploradora%))
(define efectores14 (make-object efector-exploradora%))
(define efectores15 (make-object efector-exploradora%))
(define efectores16 (make-object efector-exploradora%))
(define efectores17 (make-object efector-exploradora%))
(define efectores18 (make-object efector-exploradora%))
(define efectores19 (make-object efector-exploradora%))
(define efectores20 (make-object efector-exploradora%))
(define efectores21 (make-object efector-exploradora%))
(define efectores22 (make-object efector-exploradora%))
(define efectores23 (make-object efector-exploradora%))
(define efectores24 (make-object efector-exploradora%))
(define efectores25 (make-object efector-exploradora%))
(define efectores26 (make-object efector-exploradora%))

(provide efectores1  efectores2  efectores3 efectores4 efectores5 efectores6 efectores7 efectores8 efectores9 efectores10 efectores11 efectores12
          efectores13 efectores14 efectores15 efectores16 efectores17 efectores18 efectores19 efectores20 efectores21 efectores22 efectores23 efectores24 efectores25 efectores26)