(define-module (game util assets)
  #:use-module (ice-9 ftw)
  #:use-module (ice-9 textual-ports)
  #:use-module (chickadee graphics texture)
  #:use-module (chickadee graphics color)
  #:export (
            assets-load 
            assets-load-image 
            tile-texture 
            tile-atlas 
            hero-texture 
            hero-atlas 
            assets-map-levels 
            read-level-map
            defeat-image 
            victory-image                
            )
  
  )

(define tile-texture #f)
(define tile-atlas #f)

(define hero-texture #f)
(define hero-atlas #f)

(define defeat-image #f)
(define victory-image #f)

(define (assets-location)
  "find the location of the assets directory. The location is specified
   by the ASSET_DIR environment variable, or defaults to 'assets' in the
   current directory."
  (pk "Assets location: "
      (or (getenv "ASSET_DIR") "assets" )))

(define (assets-file-name . names)
  "Return the full path of a file in the assets directory. The file is
   specified by a list of names, which are joined together.  The
   ASSET_DIR environment variable can be used to specify a prefix to the
   asset directory."
  (string-append (assets-location) "/" (string-join names "/")))


(define (read-level-map filename)
  "Read a level map from a file. The map is a list of strings, where each
   string is a row of the map. The map is read from the file in the
   'levels' directory."
  (call-with-input-file (assets-file-name "levels" filename) get-string-all))

(define (level-map? filename )
  "Return true if the filename is a level map file. Level map files have
   the extension '.map'."
  (string-suffix? ".map" filename))

(define (assets-map-levels f)
  "Apply a function to each level map file in the 'levels' directory. The
   function is passed the filename of the level map file."
  (map 
   (compose f read-level-map)  
   (scandir (assets-file-name "levels") level-map?)))

(define (assets-load-image filename)
  "Load an image from a file in the assets directory. The filename is
   specified as a list of names, which are joined together. The image is
   returned as a texture."
  (load-image (assets-file-name "images" filename)))

(define (assets-load)
  "Load all the assets for the game."
  (set! tile-texture (assets-load-image "simples_pimples.png"))
  (set! tile-atlas (split-texture tile-texture 16 16))
  
  (set! hero-texture (assets-load-image "lr_penguin2.png"))
  (set! hero-atlas (split-texture hero-texture 32 32))
  
  (set! defeat-image (assets-load-image "defeat.jpg"))
  (set! victory-image (assets-load-image "victory.jpg"))
  )
