module Hoogle.Query.Render(renderQuery) where

import General.Code
import Data.TagStr
import Data.Generics.Uniplate
import Hoogle.Query.Type
import Hoogle.TypeSig.All


renderQuery :: Query -> TagStr
renderQuery x = Tags $ namesig ++ scp ++ itms ++ flgs
    where
        namesig = case (null (names x), isNothing (typeSig x)) of
                      (True, True) -> []
                      (True, False) -> [Str ":: " | namelike] ++ showType
                      (False, True) -> showName 
                      _ -> showName ++ [Str " :: "] ++ showType
            where namelike = and [isAlpha y || isSpace y | Str xs <- universe $ Tags showType
                                                         , y:ys <- [dropWhile isSpace xs]]
        
        showName = intersperse (Str " ") $ map (TagBold . Str) (names x)
        showType = Str (showConstraint con) :
                   intersperse (Str " -> ") 
                       (zipWith TagColor [0..] (map (Str . show) finit) ++
                        [Str (show flast)])
            where
                Just (TypeSig con args) = typeSig x
                (finit, flast) = (init funcs, last funcs)
                funcs = splitFun args
        
        scp = []
        itms = []
        
        
        flgs = concatMap (\x -> [Str " ", Str (f x)]) (flags x)
            where
                f (Flag name extra) = "/" ++ name ++ ['='|not $ null extra] ++ q ++ extra ++ q
                    where q = ['\"' | any isSpace extra]