module YesodDsl.Generator.Cabal (syncCabal) where
import YesodDsl.AST
import Distribution.PackageDescription
import Distribution.ModuleName
import Distribution.PackageDescription.Parse
import Distribution.PackageDescription.PrettyPrint
import Distribution.Package
import Distribution.Version
import Data.Maybe (fromMaybe)
import System.Directory
import Distribution.Verbosity
import System.FilePath.Posix
import Data.List
import YesodDsl.Generator.Routes
import YesodDsl.SyncFile
import Control.Monad (when)
         

syncCabal :: FilePath -> [String] -> String -> [String]-> IO ()
syncCabal path extraDeps generatedModule moduleNames = do
    e <- doesFileExist path
    when e $ do
        desc <- readPackageDescription verbose path
        syncFile path $ showGenericPackageDescription $ modifyDesc desc
    where
        modifyDesc d = d {
                condLibrary = (condLibrary d) >>= modifyCtree
            }
        modifyCtree ctree = Just $ ctree {
            condTreeData = modifyLib (condTreeData ctree),
            condTreeConstraints = nub $ ensureDeps $ condTreeConstraints ctree
        }
        modifyLib l = l {
            exposedModules = modifyExposed (exposedModules l)            
        }

        samePackage (Dependency pn1 _) (Dependency pn2 _) = pn1 == pn2

        ensureDeps deps = nubBy samePackage $ [ Dependency (PackageName name) anyVersion 
                           | name <- extraDeps ] ++ deps
        modifyExposed mods = nub $ filter notGeneratedMod mods ++ map fromString moduleNames
        notGeneratedMod = not . (generatedModule `isPrefixOf`) . (intercalate ".") . components