content: {-# LANGUAGE TemplateHaskell #-}
  
  module Config where
  
  import Data.Label
  import System.Console.GetOpt
  
  data Config = Config
    {
      _configWidth        :: Int
    , _configHeight       :: Int
    , _configZoom         :: Int
    , _configFieldOfView  :: Int
    , _configBounces      :: Int
    , _configFramerate    :: Int
    }
    deriving Show
  
  $(mkLabels [''Config])
  
  defaults :: Config
  defaults = Config
    { _configWidth        = 800
    , _configHeight       = 600
    , _configFieldOfView  = 100
    , _configZoom         = 1
    , _configBounces      = 4
    , _configFramerate    = 30
    }
  
  
  options :: [OptDescr (Config -> Config)]
  options =
    [ Option []   ["width"]       (ReqArg (set configWidth . read) "INT")         (describe configWidth "visualisation width")
    , Option []   ["height"]      (ReqArg (set configHeight . read) "INT")        (describe configHeight "visualisation height")
    , Option []   ["zoom"]        (ReqArg (set configZoom . read) "INT")          (describe configZoom "pixel replication factor")
    , Option []   ["fov"]         (ReqArg (set configFieldOfView . read) "INT")   (describe configFieldOfView "field of view")
    , Option []   ["bounces"]     (ReqArg (set configBounces . read) "INT")       (describe configBounces "ray bounce limit")
    , Option []   ["fps"]         (ReqArg (set configFramerate . read) "INT")     (describe configFramerate "frames per second")
    ]
    where
      describe f msg      = msg ++ " (" ++ show (get f defaults) ++ ")"
  
  header :: [String]
  header =
    [ "accelerate-ray (c) [2013..2014] The Accelerate Team"
    , ""
    , "Usage: accelerate-ray [OPTIONS]"
    , ""
    ]
  
  footer :: [String]
  footer =
    [ ""
    , "Runtime usage:"
    , "     WASD         move the eye position"
    , "     arrows       move the light source"
    , ""
    ]
  
  