{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns        #-}
{-# LANGUAGE OverloadedStrings     #-}

import qualified Data.ByteString                as BS
import qualified Data.List.NonEmpty             as NEL
import           Data.Text.Encoding             (encodeUtf8)
import           Distribution.Types.PackageName (mkPackageName)
import           Hpack                          (Force (..), Options (..),
                                                 defaultOptions, hpackResult,
                                                 resultCabalFile, setTarget)
import           StackageToHackage.Hackage      (printFreeze, printProject,
                                                 stackToCabal)
import           StackageToHackage.Stackage     (localDirs, readStack)
import           System.Directory               (getCurrentDirectory)
import           System.FilePath                (takeBaseName, (</>))

main :: IO ()
main = do
  dir <- getCurrentDirectory
  stack <- readStack =<< BS.readFile (dir </> "stack.yaml")
  let subs = NEL.toList $ (dir </>) <$> localDirs stack
  hResults <- traverse runHpack subs
  let ignore = (mkPackageName . takeBaseName . resultCabalFile) <$> hResults
  (project, freeze) <- stackToCabal ignore dir stack
  BS.writeFile (dir </> "cabal.project") (encodeUtf8 $ printProject project)
  BS.writeFile (dir </> "cabal.project.freeze") (encodeUtf8 $ printFreeze freeze)
  where
    runHpack sub = hpackResult $ setTarget (sub </> "package.yaml")
                                           (defaultOptions {optionsForce = Force})

-- TODO invoke cabal v2-freeze to minimise the freeze file