#lang scheme

;;;LA CLASE DE LOS ACTOS
(define acto%
  (class object%
    (field
     (proc 'procedimiento)
     (datos 'argumentos)
     )
    (define/public set-datos
      (lambda arg
        (set! datos arg)
        ))
    (define/public set-proc
      (lambda (expr-lambda)
        (set! proc expr-lambda)
        ))
    (define/public proceso
      (lambda ()
        (proc datos)
        ))
    (super-new)
    ))
;;;;;;LOS ACTOS
(define saludo-verbal (make-object acto%))
;;
(define saludar
  (lambda (data)
    (let ((i (random (length data)))
          )
      (printf "Proferencia:: ~a~n" (list-ref data i))
      #t
      )
    ))
;;
(send saludo-verbal set-proc saludar)
(send saludo-verbal set-datos
      "Hola" "Buenos días" "Hola. Buenos días")
;;
(define esperar-acto (make-object acto%))
;;
(define esperar
  (lambda (data)
    (when (char-ready? (current-input-port))
      (read-char))
    (printf "El actor espera uno o varios actos del otro~n")
    (sleep 1)
    ((first data))
    ))
(send esperar-acto set-proc esperar)
(send esperar-acto set-datos read-line)
;;
(define expresar-deseo (make-object acto%))
;;
(define proferir
  (lambda (data)
    (let ((frase (first data))
          (objeto (second data))
          )
    (printf "Proferencia:: ~a ~a ~n" frase objeto)
      #t)
    ))
;;
(send expresar-deseo set-proc proferir)
(send expresar-deseo set-datos "deseo" "retirar dinero")
;;
(define procesar-pregunta (make-object acto%))
;;
(define tipo-pregunta
  (lambda (data)
    (printf "El empleado pregunta por cc o DNI o cantidad~n")
    (when (char-ready? (current-input-port))
        (read-char))
    (let* ((id-pregunta (read))
           (dato (assoc id-pregunta data))
           )
      (printf "~a ~n" dato)
      dato)
    ))
(send procesar-pregunta set-proc tipo-pregunta)
(send procesar-pregunta set-datos (cons 'DNI 123) (cons 'cc 1001) (cons 'cantidad 789))
;;
(define despedida-verbal (make-object acto%))
;;
(send despedida-verbal set-proc saludar)
(send despedida-verbal set-datos 
      "Gracias. Adiós" "Gracias. Adiós, buen día" "Gracias. Buen día")
;;
(define respuesta-pregunta (make-object acto%))
;;
(define responder
  (lambda (data)
    (first data)
    ))
;;
(send respuesta-pregunta set-proc responder)
;(send respuesta-pregunta set-datos 

;;LOS GUIONES. CLASE ROL
(define rol%
  (class object%
    (field
     (actos '())
     )
    (define/public set-actos
      (lambda arg
        (set! actos arg)
        ))
    (define/public accion
      (lambda ()
        (let itera ((lst actos))
          (if (null? lst)
              'hecho
              (begin
                (send (first lst) proceso)
                (itera (rest lst))
                )
              )
          )
        ))
    (super-new)
    ))

;;LA INSTANCIA CLIENTE DE UN BANCO
(define cliente-en-banco (make-object rol%))
(send cliente-en-banco set-actos 
      saludo-verbal
      esperar-acto
      expresar-deseo
      procesar-pregunta
      procesar-pregunta
      esperar-acto
      despedida-verbal)
;;
(send cliente-en-banco accion)