module Test.Doctest.Find (findSourceFiles) where

import           Distribution.ModuleName               hiding (main)
import           Distribution.PackageDescription
import           Distribution.PackageDescription.Parse
import           Distribution.Verbosity

import           System.Directory
import           System.FilePath

import           Control.Monad.List

findSourceFiles :: IO [FilePath]
findSourceFiles =
    runListT $
    do curDir <- lift getCurrentDirectory
       let getCabalFile =
               map (curDir </>) . filter ((".cabal" ==) . takeExtension)
       cabalFile <- (ListT . fmap getCabalFile . getDirectoryContents) curDir
       packDesc <- lift $ readPackageDescription normal cabalFile
       let getLocs em lbi =
               ListT $
               filterM
                   doesFileExist
                   [ curDir </> dir </> mdn <.> ext
                   | dir <- hsSourceDirs lbi
                   , mdn <- map toFilePath em
                   , ext <- ["lhs", "hs"] ]
       condLib <- maybe (ListT (pure [])) pure (condLibrary packDesc)
       let libInfo = condTreeData condLib
       getLocs (exposedModules libInfo) (libBuildInfo libInfo)