{-# LANGUAGE NoImplicitPrelude     #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedRecordDot   #-}

-- | Default configuration options for building.
module Stack.BuildOpts
  ( defaultBuildOpts
  , defaultTestOpts
  , defaultHaddockOpts
  , defaultBenchmarkOpts
  ) where

import           Distribution.Verbosity ( normal )
import           Stack.Prelude
import           Stack.Types.BuildOpts
                   ( BenchmarkOpts (..), BuildOpts (..), HaddockOpts (..)
                   , TestOpts (..)
                   )
import           Stack.Types.BuildOptsMonoid
                   ( BenchmarkOptsMonoid (..), BuildOptsMonoid (..)
                   , CabalVerbosity (..), ProgressBarFormat (..)
                   , TestOptsMonoid (..)
                   )

defaultBuildOpts :: BuildOpts
defaultBuildOpts = BuildOpts
  { libProfile = defaultFirstFalse buildMonoid.libProfile
  , exeProfile = defaultFirstFalse buildMonoid.exeProfile
  , libStrip = defaultFirstTrue buildMonoid.libStrip
  , exeStrip = defaultFirstTrue buildMonoid.exeStrip
  , buildHaddocks = False
  , haddockOpts = defaultHaddockOpts
  , openHaddocks = defaultFirstFalse buildMonoid.openHaddocks
  , haddockDeps = Nothing
  , haddockExecutables = defaultFirstFalse buildMonoid.haddockExecutables
  , haddockTests = defaultFirstFalse buildMonoid.haddockTests
  , haddockBenchmarks = defaultFirstFalse buildMonoid.haddockBenchmarks
  , haddockInternal = defaultFirstFalse buildMonoid.haddockInternal
  , haddockHyperlinkSource = defaultFirstTrue buildMonoid.haddockHyperlinkSource
  , haddockForHackage = defaultFirstFalse buildMonoid.haddockForHackage
  , installExes = defaultFirstFalse buildMonoid.installExes
  , installCompilerTool = defaultFirstFalse buildMonoid.installCompilerTool
  , preFetch = defaultFirstFalse buildMonoid.preFetch
  , keepGoing = Nothing
  , keepTmpFiles = defaultFirstFalse buildMonoid.keepTmpFiles
  , forceDirty = defaultFirstFalse buildMonoid.forceDirty
  , tests = defaultFirstFalse buildMonoid.tests
  , testOpts = defaultTestOpts
  , benchmarks = defaultFirstFalse buildMonoid.benchmarks
  , benchmarkOpts = defaultBenchmarkOpts
  , reconfigure = defaultFirstFalse buildMonoid.reconfigure
  , cabalVerbose = CabalVerbosity normal
  , splitObjs = defaultFirstFalse buildMonoid.splitObjs
  , skipComponents = []
  , interleavedOutput = defaultFirstTrue buildMonoid.interleavedOutput
  , progressBar = CappedBar
  , ddumpDir = Nothing
  }
 where
  buildMonoid = undefined :: BuildOptsMonoid

defaultTestOpts :: TestOpts
defaultTestOpts = TestOpts
  { rerunTests = defaultFirstTrue toMonoid.rerunTests
  , additionalArgs = []
  , coverage = defaultFirstFalse toMonoid.coverage
  , runTests = defaultFirstTrue toMonoid.runTests
  , maximumTimeSeconds = Nothing
  , allowStdin = defaultFirstTrue toMonoid.allowStdin
  }
 where
  toMonoid = undefined :: TestOptsMonoid

defaultHaddockOpts :: HaddockOpts
defaultHaddockOpts = HaddockOpts { additionalArgs = [] }

defaultBenchmarkOpts :: BenchmarkOpts
defaultBenchmarkOpts = BenchmarkOpts
  { additionalArgs = Nothing
  , runBenchmarks = defaultFirstTrue beoMonoid.runBenchmarks
  }
 where
  beoMonoid = undefined :: BenchmarkOptsMonoid
