{-# LANGUAGE FlexibleContexts, CPP #-}

module Diagrams.Puzzles.CmdLine 
    ( B
    , renderToFile
    , RenderOpts(..)
    , formats
    , checkFormat
    )
  where

import Data.Puzzles.CmdLine (exitErr)

import Diagrams.Prelude hiding (value, option, (<>), Result)
import Control.Monad (unless)

#ifdef CAIRO
import Diagrams.Backend.Cairo (B, renderCairo)
#else
import Diagrams.Backend.SVG (B, renderSVG)
#endif

data RenderOpts = RenderOpts { _file :: FilePath, _w :: Double }

renderB :: FilePath -> SizeSpec V2 Double -> Diagram B -> IO ()
renderB =
#ifdef CAIRO
    renderCairo
#else
    renderSVG
#endif

renderToFile :: RenderOpts -> Diagram B -> IO ()
renderToFile ropts = renderB (_file ropts) (mkWidth $ _w ropts)

formats :: [String]
#ifdef CAIRO
formats = ["png", "svg", "ps", "pdf"]
#else
formats = ["svg"]
#endif

checkFormat :: String -> IO ()
checkFormat f = unless (f `elem` formats) $
                    exitErr $ "unknown format: " ++ f