module Diagrams.Puzzles.Pyramid where
import Diagrams.Prelude
import Data.Puzzles.Elements
import Data.Puzzles.Pyramid
import Diagrams.Puzzles.Lib
import Diagrams.Puzzles.Widths
import Diagrams.Puzzles.Grid (border)
pgray :: Colour Double
pgray = blend 0.6 white black
cell :: (Backend b R2, Renderable (Path R2) b) => Bool -> Diagram b R2
cell s = square 1 # lw onepix # if s then fc pgray else id
clue :: (Backend b R2, Renderable (Path R2) b) => Maybe Int -> Diagram b R2
clue Nothing = mempty
clue (Just c) = text' (show c)
cellc :: (Backend b R2, Renderable (Path R2) b) => Bool -> Maybe Int -> Diagram b R2
cellc s c = clue c `atop` cell s
row :: (Backend b R2, Renderable (Path R2) b) => Row -> Diagram b R2
row (R cs s) = centerX . hcat . map (cellc s) $ cs
pyramid :: (Backend b R2, Renderable (Path R2) b) => Pyramid -> Diagram b R2
pyramid p = phantom' (border (s, s)) <> (alignBL . vcat . map row . unPyr $ p)
where s = psize p
kropki :: (Backend b R2, Renderable (Path R2) b) => KropkiDot -> Diagram b R2
kropki None = mempty
kropki c = circle 0.1 # lw 0.03 # fc (col c) # smash
where col White = white
col Black = blend 0.98 black white
col None = error "can't reach"
krow :: (Backend b R2, Renderable (Path R2) b) => KropkiRow -> Diagram b R2
krow (KR cs s ks) = ccat dots <> ccat clues
where ccat = centerX . hcat
clues = map (cellc s) cs
clues' = map (cellc s) cs :: [D R2]
dots = interleave (map phantom' clues') (map kropki ks)
kpyramid :: (Backend b R2, Renderable (Path R2) b) => RowKropkiPyramid -> Diagram b R2
kpyramid p = phantom' (border (s, s)) <> (alignBL . vcat . map krow . unKP $ p)
where s = psize (plainpyramid p)