#lang scheme

(require scheme/class)

(define agente%
  (class object%
    ;;propiedades
    (field
     (entrada 'proc-interpretación-mensaje)
     (tarea 'proc-operación))
    ;;métodos
    (define accion
      (lambda (mensaje)
        (let* ((input-clave (car mensaje))
               (input-datos (cadr mensaje))
               (agente-superior (caddr mensaje));objeto que manda mensaje
               (concernido (entrada input-clave)) )
          (when concernido
            (tarea input-datos agente-superior)) ) ))
    ;;lo público
    (public accion)
    ;;inicialización
    (super-new) ))

;;;;;;;
(define abrir-agente
  (lambda (%)
    (class %
      (define interpretacion-abrir
        (lambda (clave-operacion)
          (if (equal? clave-operacion 'abrir)
              #t
              #f) ))
      (define tarea-de-abrir
        (lambda (datos agente-sup)
          (let* ((nombre (car datos))
                 (dni (cadr datos))
                 (id-cc (send agente-sup tabla-new 'cuentas))
                 (id-per (send agente-sup tabla-new 'personas))
                 (reg-cc (vector id-cc 0 id-per))
                 (reg-per (vector id-per nombre dni id-cc))
                 )
            (send agente-sup tabla-add! 'cuentas reg-cc)
            (send agente-sup tabla-add! 'personas reg-per)
            (list "creada cuenta con no: " id-cc )
            ) ))
      (inherit-field entrada tarea)
      (set! entrada interpretacion-abrir)
      (set! tarea tarea-de-abrir)
      (super-new) )))

;(set! mensaje (list 'abrir (list nombre dni cantidad)) this)

(define abrir% (abrir-agente agente%))
(define a (make-object abrir%))