module HackPort.GlobalFlags
    ( GlobalFlags(..)
    , defaultGlobalFlags
    , withHackPortContext
    ) where

import qualified Distribution.Verbosity as DV
import qualified Distribution.Simple.Setup as DSS
import qualified Distribution.Client.Config as DCC
import qualified Distribution.Client.GlobalFlags as DCG
import qualified Distribution.Client.Types as DCT
import qualified Distribution.Utils.NubList as DUN

import qualified Network.URI as NU

import System.FilePath ((</>))

import qualified Overlays

data GlobalFlags =
    GlobalFlags { globalVersion :: DSS.Flag Bool
                , globalNumericVersion :: DSS.Flag Bool
                , globalPathToOverlay :: DSS.Flag (Maybe FilePath)
                , globalPathToPortage :: DSS.Flag (Maybe FilePath)
                }

defaultGlobalFlags :: GlobalFlags
defaultGlobalFlags =
    GlobalFlags { globalVersion = DSS.Flag False
                , globalNumericVersion = DSS.Flag False
                , globalPathToOverlay = DSS.Flag Nothing
                , globalPathToPortage = DSS.Flag Nothing
                }

defaultRemoteRepo :: DCT.RemoteRepo
defaultRemoteRepo = DCC.addInfoForKnownRepos $ (DCT.emptyRemoteRepo name) { DCT.remoteRepoURI = uri }
   where
    Just uri = NU.parseURI "https://hackage.haskell.org/"
    name     = "hackage.haskell.org"

withHackPortContext :: DV.Verbosity -> GlobalFlags -> (DCG.RepoContext -> IO a) -> IO a
withHackPortContext verbosity global_flags callback = do
    overlayPath <- Overlays.getOverlayPath verbosity (DSS.fromFlag $ globalPathToOverlay global_flags)
    let flags = DCG.defaultGlobalFlags {
                    DCG.globalRemoteRepos = DUN.toNubList [defaultRemoteRepo]
                  , DCG.globalCacheDir    = DSS.Flag $ overlayPath </> ".hackport"
                }
    DCG.withRepoContext verbosity flags callback
