module Language.LaTeX.Checker where

import Data.Set (Set)
import qualified Data.Set as Set
import Data.Generics.Uniplate.Data (universeBi)
import Language.LaTeX.Types

providedPackages :: PreambleItm -> Set PackageName
providedPackages x = Set.fromList [ pkg | ProvidePackage pkg <- universeBi x ]

neededPackages :: Document -> Set PackageName
neededPackages x = Set.fromList [ pkg | PackageDependency pkg <- universeBi x ]

checkDocument :: Document -> Maybe ErrorMessage
checkDocument doc
  | not . null $ missingPkgs = Just ("Missing packages: " ++ show missingPkgs)
  | otherwise                = Nothing
 where providedPkgs = providedPackages . documentPreamble $ doc
       neededPkgs   = neededPackages doc
       missingPkgs  = map getPkgName . Set.toList $ neededPkgs `Set.difference` providedPkgs