#lang scheme/gui

;;;;;;;;;;;
(define calculo-puntos->grid
  (lambda (num-cuad ancho alto off)
    (let* ((long_cuad (* num-cuad off))
           (x_vert (- (/ ancho 2) (/ long_cuad 2)))
           (y1_vert (- (/ alto 2) (/ long_cuad 2)))
           (y2_vert (+ (/ alto 2) (/ long_cuad 2)))
           (y_hor (- (/ alto 2) (/ long_cuad 2)))
           (x1_hor (- (/ ancho 2) (/ long_cuad 2)))
           (x2_hor (+ (/ ancho 2) (/ long_cuad 2)))
           )
      (values
       ;long_cuad
       (list x_vert y1_vert y2_vert)
       (list y_hor x1_hor x2_hor)
       )
      )
    ))
(define grid
  (lambda (dc num-cuad ancho alto offset)
    (let*-values ([(vertical horizontal) 
                   (calculo-puntos->grid num-cuad ancho alto offset)]
                  [(x_vert) (first vertical)]
                  [(y1_vert) (second vertical)]
                  [(y2_vert) (third vertical)]
                  [(y_hor) (first horizontal)]
                  [(x1_hor) (second horizontal)]
                  [(x2_hor) (third horizontal)]
                  )
      (letrec
          ((grid-vertical
            (lambda (num x y1 y2 offset dc)
              (if (= num 0)
                  #t
                  (begin
                    ;(send dc draw-line (* x xoffset) y1 (* x xoffset) y2)
                    (send dc draw-line x y1 x y2)
                    ;(grid-vertical (sub1 num) (add1 x) y1 y2 xoffset dc)
                    (grid-vertical (sub1 num) (+ x offset) y1 y2 offset dc)
                    )
                  ) ))
           (grid-horizontal
            (lambda (num x1 x2 y offset dc)
              (if (= num 0)
                  #t
                  (begin
                    ;(send dc draw-line x1 (* y yoffset) x2 (* y yoffset))
                    (send dc draw-line x1 y x2 y)
                    ;(grid-horizontal (sub1 num) x1 x2 (add1 y) yoffset dc)
                    (grid-horizontal (sub1 num) x1 x2 (+ y offset) offset dc)
                    )
                  ) ))
;           (double-offset (* offset 2))
           )
        (grid-vertical (add1 num-cuad) x_vert y1_vert y2_vert offset dc) 
;                     (- (/ ancho 2) (/ double-offset 2));220 
;                     (- (/ alto 2) (/ double-offset 2))  
;                     (+ (/ alto 2) (/ double-offset 2)) 
;                     offset dc)
        (grid-horizontal (add1 num-cuad) x1_hor x2_hor y_hor offset dc)
;                       (- (/ ancho 2) (/ double-offset 2))
;                       (+ (/ ancho 2) (/ double-offset 2))
;                       (- (/ alto 2) (/ double-offset 2))
;                       offset dc);220 380 1 
        )
      )
    ))
;;;;;;;;;

;;;;;;;;;;;;;;;
;(define run-button (instantiate button% ("&Run" ventana)
;                     (callback (lambda (b e)
;                                 (muestra-mundo m dc)))))
;;; LAS HERRAMIENTAS
(define lapiz-azul
  (make-object pen%
    "blue"
    10
    'solid))

(define lapiz-rojo
  (make-object pen%
    "red"
    10
    'solid))

(define brocha-roja
  (make-object brush%
    "red"
    'solid))

(define brocha-blanca
  (make-object brush%
    "white"
    'solid))

;;; Procedimientos de dibujo
(define pinta-estimulo
  (lambda (x y diam estimulo dc)
    (let ((brush (send dc get-brush)))
      (send dc set-brush 
            (if (= estimulo 0)
                brocha-blanca
                brocha-roja
                ))
      (send dc draw-ellipse x y diam diam)
      (send dc set-brush brush)
      )
    ))
(define pinta-fila
  (lambda (x y off lst-est dc)
    (let go ((i 0)
             (j (length lst-est))
             )
      (if (= i j)
          #t
          (begin
            (pinta-estimulo x y off (list-ref lst-est i) dc)
            (set! x (+ x off))
            (go (add1 i) j)
            )
          )
      )
    ))
(define pintar
  (lambda (señales x_ancho y_alto long_fila num_filas off dc)
    (let-values ([(x y) (coord-orig x_ancho y_alto long_fila off)] )
      (let go ((i 0)
               (j num_filas)
               )
        (if (= i j)
            #t
            (begin
              (pinta-fila x y off (take señales long_fila) dc)
              (set! y (+ y off))
              (set! señales (list-tail señales long_fila))
              (go (add1 i) j)
              )
            )
        )
      )
    ))
;;; Procedimientos de dibujo
(define metodo-pintar
  (lambda (señales x y diam dc)
    (let go ((i 0)
             (j (length señales))
             )
      (if (= i j)
          #t
          (begin
            (pinta-estimulo (* (+ x diam) i) y diam (list-ref señales i) dc)
            (go (add1 i) j)
            )
          )
      )
    ))
(define coord-orig
  (lambda (ancho alto num_cuad off)
    (let* ((long_cuad (* num_cuad off))
           (x (- (/ ancho 2) (/ long_cuad 2)))
           (y (- (/ alto 2) (/ long_cuad 2)))
           )
      (values x y)
      )
    ))
;(define pinta
;  (lambda (output x y hoffset)
;    (cond
;      ((null? output) )
;      ((= (car output) 1)
;       (send dc set-brush brocha-roja)
;       (send dc draw-ellipse x y 20 20); curioso 20 20 x y
;       (pinta (cdr output) (+ x hoffset) y hoffset))
;      (else
;       (send dc set-brush brocha-blanca)
;       (send dc draw-ellipse x y 20 20)
;       (pinta (cdr output) (+ x hoffset) y hoffset))
;      ) ))
;;;;;;;;;;;;
(provide grid pintar metodo-pintar)