{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}
module Lambdabot.Config.Core
    ( commandPrefixes
    , disabledCommands
    , editDistanceLimit
    , enableInsults
    , onStartupCmds
    , outputDir
    , dataDir
    , lbVersion
    , textWidth
    , uncaughtExceptionHandler

    , replaceRootLogger
    , lbRootLoggerPath
    , consoleLogHandle
    , consoleLogLevel
    , consoleLogFormat
    ) where

import Lambdabot.Config
import Lambdabot.Logging

import Control.Exception
import System.IO
import Data.Version

-------------------------------------
-- Core configuration variables

config "commandPrefixes"    [t| [String]                |] [| ["@", "?"]    |]
config "disabledCommands"   [t| [String]                |] [| []            |]
config "editDistanceLimit"  [t| Int                     |] [| 3 :: Int      |]
config "enableInsults"      [t| Bool                    |] [| True          |]
configWithMerge [| (++) |] "onStartupCmds" [t| [String] |] [| ["offline"]   |]
config "outputDir"          [t| FilePath                |] [| "State/"      |]
-- the dataDir variable will be filled by lambdabot's executable
config "dataDir"            [t| FilePath                |] [| "."           |]
-- ditto for lbVersion
config "lbVersion"          [t| Version                 |] [| Version [] [] |]

-- IRC maximum msg length, minus a bit for safety.
config "textWidth"          [t| Int                     |] [| 200 :: Int    |]

-- basic logging.  for more complex setups, configure directly using System.Log.Logger
config "replaceRootLogger"  [t| Bool                    |] [| True                        |]
config "lbRootLoggerPath"   [t| [String]                |] [| []                          |]
config "consoleLogHandle"   [t| Handle                  |] [| stderr                      |]
config "consoleLogLevel"    [t| Priority                |] [| NOTICE                      |]
config "consoleLogFormat"   [t| String                  |] [| "[$prio] $loggername: $msg" |]

--------------------------------------------
-- Default values with longer definitions

defaultIrcHandler :: SomeException -> IO ()
defaultIrcHandler = errorM . ("Main: caught (and ignoring) "++) . show

type DIH = SomeException -> IO ()
-- work around a TemplateHaskell bug in ghc-8.6.1
-- see https://ghc.haskell.org/trac/ghc/ticket/15815

config "uncaughtExceptionHandler" [t| DIH |] [| defaultIrcHandler |]
