#lang racket
(require gigls/unsafe)




;Color Schemes (bgcolor, fgcolor)
    ;definition for assoc taken from CSC151-01 website.
(define assoc
  (lambda (key alist)
    (cond
      [(null? alist) 
       #f]
      [(equal? key (car (car alist))) 
       (car alist)]
      [else 
       (assoc key (cdr alist))])))

(define color-scheme
  (list (list 0 "orangered" "green")
        (list 1 "pink" "yellow")
        (list 2 "purple" "goldenrod")
        (list 3 "navy" "lightcoral")
        (list 4 "turquoise" "red")
        (list 5 "powderblue" "firebrick")
        (list 6 "yellowgreen" "violet")))

;;;;Polygon Procedures and Helpers
   ;turtle-spin-centered-polygon! was adapted from Assignment 7
   ; by Dan Davis and China Mauck

(define action01!
  (lambda (turtle side-length sides)
    (turtle-forward! turtle side-length)
     (turtle-turn! turtle (/ 360 sides))))

(define turtle-polygon!
  (lambda (turtle side-length sides)
    (repeat sides action01! turtle side-length sides)))

(define turtle-choose-center-polygon! 
  (lambda (turtle radius sides col row)
    (let ([interior-angle (/ (* 180 (- sides 2)) sides)])
      (turtle-up! turtle)
      (turtle-teleport! turtle col row)
      (turtle-forward! turtle radius)
      (turtle-down! turtle)
      (turtle-turn! turtle (- 180 (/ interior-angle 2)))
      (turtle-polygon! turtle (* 2 radius (sin (/ pi sides))) sides)
      (turtle-turn! turtle (/ interior-angle 2))
      (turtle-up! turtle)
      (turtle-forward! turtle radius)
      (turtle-turn! turtle 180)
      (turtle-down! turtle))))   

(define turtle-spin-center-helper!
  (lambda (turtle angle radius sides copies col row m)
    (turtle-choose-center-polygon! turtle radius sides 
                                   (* 1/2 col) 
                                   row)
    (turtle-turn! turtle angle)
    (turtle-spin-centered-polygon! turtle radius sides angle (- copies 1)
                                   (- col (* (/ 1 m) col)) 
                                   (- row (* (/ 1 (* 2 m)) row))
                                   m)))

(define turtle-spin-centered-polygon!
  (lambda (turtle radius sides angle copies col row m)
    (when (> copies 0)
      (turtle-spin-center-helper! turtle angle radius sides copies
                                  col 
                                  row
                                  m)))) 


;;;;
(define image-series
  (lambda (n width height)         
    ;;;;Create Backdrop
    (let backdrop ([canvas (image-compute (let* ([bgcolor 
                                                  (color-name->irgb (list-ref 
                                                                     (assoc (modulo n 7) color-scheme) 1))]
                                                 [shades
                                                  (list 
                                                   ((o irgb-darker irgb-darker irgb-darker) bgcolor)
                                                   bgcolor
                                                   ((o irgb-lighter irgb-lighter) bgcolor)
                                                   ((o irgb-darker irgb-darker irgb-darker irgb-darker) bgcolor)
                                                   (irgb-lighter bgcolor)
                                                   bgcolor
                                                   ((o irgb-lighter irgb-lighter irgb-lighter) bgcolor)
                                                   (irgb-phaseshift bgcolor)
                                                   bgcolor)])
                                            (lambda (col row) 
                                              (list-ref shades (modulo (inexact->exact (round (sin (* (/ (* 4000 col) width) (/ (* 4000 row) height))))) 8))))
                                          width height)])
      (image-show canvas) 
      ;;;;Black Dot
      (context-set-fgcolor! "black")
      (image-select-ellipse! canvas REPLACE 
                             (* width 2/3)
                             (* height 1/3)
                             (* (expt 2 (+ 1 (modulo n 4))) (* width 1/49))
                             (* (expt 2 (+ 1 (modulo n 4))) (* height 1/49)))
      (image-fill-selection! canvas)
      (image-select-nothing! canvas)
      ;;;;Draw Polygons
      ;turtle-spin-centered-polygon! was adapted from Assignment 7
      ; by Dan Davis and China Mauck
      (let polygonturtle
        ([ShellSilverstein (turtle-new canvas)]) 
        (turtle-set-brush! ShellSilverstein  "2. Hardness 075")
        (turtle-set-color! ShellSilverstein (list-ref
                                             ;get discordant fgcolor from color scheme                                    
                                             (assoc (modulo n 7) color-scheme) 2))
        (turtle-spin-centered-polygon! ShellSilverstein
                                       (* 1/5 width)
                                       (+ 3 (modulo 5 n))
                                       (/ 360 (+ 1 (modulo 9 n)))
                                       (* 2 (+ 1 (modulo 9 n)))
                                       width
                                       height
                                       (* 2 (+ 1 (modulo 9 n))))))))