{-# LANGUAGE TemplateHaskell #-}
--------------------------------------------------------------------
-- |
-- Copyright :  (c) Edward Kmett and Dan Doel 2012-2014
-- License   :  BSD2
-- Maintainer:  Edward Kmett <ekmett@gmail.com>
-- Stability :  experimental
-- Portability: non-portable
--
-- This module provides access to the Ermine 'logo' and the current
-- 'version' number.
--------------------------------------------------------------------
module Ermine.Version
  ( logo
  , version
  ) where

import Control.Applicative
import Data.ByteString.UTF8 (toString)
import Data.FileEmbed
import Data.List.Split
import Data.Version
import qualified Paths_ermine
import System.Directory
import System.FilePath
import System.Random
import System.IO.Unsafe

-- | Obtain a copy of the Ermine logo.
logo :: String
logo = unsafePerformIO $ do
  home <- getHomeDirectory
  let rc = home </> ".erminerc"
  test <- doesFileExist rc
  if test
    then readFile rc >>= \s -> randomRIO (0,read s :: Int) >>= \n -> if n == 0 then logos else return rat
    else return rat

-- | Grab the version number from this project.
version :: String
version = showVersion Paths_ermine.version { versionTags = ["α"] }

logos :: IO String
logos = do
  let txt = filter ((>3).length)
          . splitOn [""] . lines . toString $ $(embedFile $ "etc" </> "logos.txt")
  small:xs@(l1:l2:l3:l4:rest) <- (txt !!) <$> randomRIO (0, length txt - 1)
  let n = maximum (map length xs)
  let pad ys = ys ++ replicate (n - length ys) ' '
      (nm, slogan) = drop 1 <$> break (';'==) small
  return $ unlines $
    [ l1
    , pad l2 ++ ' ' : nm ++ ' ' : version
    , l3
    , pad l4 ++ ' ' : slogan
    ] ++ rest

rat :: String
rat = toString $ $(embedFile $ "etc" </> "logo.txt")
