#lang scheme

(provide interfaz)

(define agente% 
  (class object%
;;;;propiedades
    (init-field
     (parte-de-sistema 'object)
     )
;;;;métodos de acceso y cambio
    (define get-sistema
      (lambda ()
        parte-de-sistema))
    (define set-sistema
      (lambda (obj)
        (set! parte-de-sistema obj) ))
;;;;métodos de procesamiento
    (define entrada
      (lambda (mensa)
        "cada tipo de agente ha de establecer este método"))
    (define tarea
      (lambda (datos)
        "cada tipo de agente ha de establecer este método"))
    (define accion 
      (lambda () 
        "cada tipo de agente ha de establecer este método" ))
    (public get-sistema set-sistema entrada tarea accion)
    (super-new) ))
;;;;
(define interfaz%
  (class agente%
    (init-field
     (claves1 #f)
     (claves2 #f)
     (claves3 #f))
    (inherit-field parte-de-sistema)
    (field
     (historia-frases '()))
    ;;:
    (define/public get-historia-frases
      (lambda ()
        historia-frases))
    ;;;
    (define string->lista-palabras
      (lambda (str)
        (letrec
            ((aux
              (lambda (str i)
                (if (= (string-length str) i)
                    (list str)
                    (if (char=? (string-ref str i) #\space)
                        (cons
                         (substring str 0 i)
                         (aux (substring str (add1 i) (string-length str)) 0))
                        (aux str (add1 i)))
                    )))
             )
          (aux str 0))))
    (define ordinal-y
      (lambda (lista-pal n)
        (if (null? lista-pal)
            0
            (if (string=? (car lista-pal) "y")
                n
                (ordinal-y (cdr lista-pal) (add1 n)))) ))
    (define divide-mensaje
      (lambda (entrada); claves1 claves2)
        (let* ((y (ordinal-y entrada 0))
               (mensa1 #f)
               (mensa2 #f)
               )
          (if (= y 0)
              (begin
                (set! mensa1 entrada)
                (set! mensa2 '()) )
              (begin
                (set! mensa1 (take entrada y))
                (set! mensa2 (list-tail entrada (add1 y))) )
              )
          (list mensa1 mensa2)
          )))
    (define orden
      (lambda (entrada claves)
        (let ((orden #f))
          (for-each
           (lambda (clave)
             (for-each
              (lambda (palabra)
                (when (string=? palabra clave)
                  ;(set! orden clave)
                  (set! orden (string->symbol clave))
                  ))
              entrada))
           claves)
          orden
          ;(string->symbol orden)
          )))
    (define cons-mensa
      (lambda (lst-mensa clave1 clave2 clave3)
        (let* ((mensa1 (car lst-mensa))
               (mensa2 (cadr lst-mensa))
               (orden1 (orden mensa1 clave1))
               (obj1 (orden mensa1 clave3))
               (orden2 #f)
               (obj2 #f)
               )
          (unless (null? mensa2)
            (set! orden2 (orden mensa2 clave2))
            (set! obj2 (orden mensa2 clave3)) )
          (list
           (list orden1 obj1)
           (list orden2 obj1 obj2)) )))
    ;;;proceso
    (override accion)
    (define accion
      (lambda ()
        (let* ((frase (read-line))
               (lst-palabras (string->lista-palabras frase))
               (dos-ordenes (divide-mensaje lst-palabras))
               (para-mensaje (cons-mensa dos-ordenes claves1 claves2 claves3))
               (mensa-1 (car para-mensaje))
               (mensa-2 (cadr para-mensaje))
               )
          (if (car mensa-2)
              (list mensa-1 mensa-2)
              (list mensa-1 #f))
          ) ))
    ;;;
    (super-new) ))

(define interfaz 
  (make-object interfaz% 
    '("levantar" "alzar" "levanta" "alza" "subir" "sube")
    '("poner" "pon" "ponlo" "dejar" "deja" "dejalo" "depositar" "deposita" "depositalo")
    '("a" "b" "c" "d" "e" "f" "cesto") 'robot))

;(define claves1 '("levantar" "alzar" "levanta" "alza" "subir" "sube"))
;(define claves2 '("poner" "pon" "ponlo" "dejar" "deja" "dejalo" "depositar" "deposita" "depositalo"))
;(define claves2.1 '("encima" "en"))
;(define claves3 '("a" "b" "c" "d" "e" "f" "cesto"))


;(send interfaz accion)
