#lang scheme/base

(require scribble/manual
         scribble/core
         scribble/decode
         scribble/html-properties
         scribble/latex-properties
         setup/main-collects
         "private/counter.rkt")

(provide figure
         figure*
         figure**
         figure-here
         Figure-target 
         Figure-ref
         figure-ref
         (rename-out [leftfigure-style left]
                     [leftfiguremulti-style leftfiguremulti]
                     [leftfiguremultiwide-style leftfiguremultiwide]))

(define figure-style-extras
  (let ([abs (lambda (s)
               (path->main-collects-relative
                (collection-file-path s "scriblib")))])
    (list (make-css-addition (abs "figure.css"))
          (make-tex-addition (abs "figure.tex")))))

(define herefigure-style  (make-style "Herefigure" figure-style-extras))
(define figureinside-style (make-style "FigureInside" figure-style-extras))
(define legend-style (make-style "Legend" figure-style-extras))

(define centertext-style (make-style "Centertext" figure-style-extras))
(define figure-style (make-style "Figure" figure-style-extras))

(define centerfigure-style (make-style "Centerfigure" figure-style-extras))
(define centerfiguremulti-style (make-style "CenterfigureMulti" figure-style-extras))
(define centerfiguremultiwide-style (make-style "CenterfigureMultiWide" figure-style-extras))

(define leftfigure-style (make-style "Leftfigure" figure-style-extras))
(define leftfiguremulti-style (make-style "LeftfigureMulti" figure-style-extras))
(define leftfiguremultiwide-style (make-style "LeftfigureMultiWide" figure-style-extras))

(define (figure tag caption #:style [style centerfigure-style] . content)
  (apply figure-helper figure-style style tag caption content))

(define (figure-here tag caption . content)
  (apply figure-helper herefigure-style centerfigure-style tag caption content))

(define (figure-helper figure-style content-style tag caption . content)
  (make-nested-flow 
   figure-style 
   (list
     (make-nested-flow content-style (list (make-nested-flow figureinside-style (decode-flow content))))
     (make-paragraph centertext-style (list (make-element legend-style (list (Figure-target tag) ": " caption)))))))

(define (*figure style tag caption content)
  (make-nested-flow
   style
   (list
    (make-nested-flow
     figureinside-style
     (append
      (decode-flow content)
      (list
       (make-paragraph
        plain
        (list (make-element legend-style (list (Figure-target tag) ": " caption))))))))))

(define (figure* tag caption . content)
  (*figure centerfiguremulti-style tag caption content))
(define (figure** tag caption . content)
  (*figure centerfiguremultiwide-style tag caption content))

(define figures (new-counter "figure"))
(define (Figure-target tag)
  (counter-target figures tag "Figure"))
(define (Figure-ref tag)
  (make-element #f (list (counter-ref figures tag "Figure"))))
(define (figure-ref tag)
  (make-element #f (list (counter-ref figures tag "figure"))))
