{-# LANGUAGE OverloadedStrings #-}
module LLVM.HtmlWrapper ( writeHtmlIndex, writeHtmlWrapper ) where

import Control.Monad ( forM_ )
import qualified Data.ByteString.Lazy as LBS
import Data.Monoid
import System.FilePath
import Text.Blaze.Html5
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A
import Text.Blaze.Html.Renderer.Utf8 ( renderHtml )

writeHtmlWrapper :: FilePath -> FilePath -> FilePath -> String -> Double -> Double -> IO ()
writeHtmlWrapper dirname hfilename gfilename fname w h = do
  let wrapper = htmlWrapper fname gfilename w h
  LBS.writeFile (dirname </> hfilename) (renderHtml wrapper)

htmlWrapper :: String -> FilePath -> Double -> Double -> Html
htmlWrapper fname gfilename w h = H.docTypeHtml $ do
  H.head $ do
    H.title (toHtml fname)
    H.script ! A.src "OpenLayers.js" ! A.type_ "text/javascript" $ return ()
    H.script ! A.src "jquery-1.7.1.js" ! A.type_ "text/javascript" $ return ()
    H.script ! A.src "showGraph.js" ! A.type_ "text/javascript" $ return ()
    H.link ! A.href "graph.css" ! A.rel "stylesheet" ! A.type_ "text/css"
  H.body $ do
    H.div ! A.id "map" $ return ()
    H.script ! A.type_ "text/javascript" $ H.preEscapedToMarkup (loadScript gfilename w h)

loadScript :: String -> Double -> Double -> String
loadScript n w h = mconcat [ "$(window).bind('load', function () {"
                           , "  showGraph('map', '", n , "', ", show w, ", ", show h, ");\n"
                           , "});"
                           ]

writeHtmlIndex :: FilePath -> [String] -> IO ()
writeHtmlIndex dir funcNames =
  LBS.writeFile (dir </> "index.html") (renderHtml (htmlIndex funcNames))

htmlIndex :: [String] -> Html
htmlIndex funcNames = H.docTypeHtml $ do
  H.head $ do
    H.title "Module Summary"
  H.body $ do
    H.ul $ forM_ funcNames mkLink
  where
    mkLink n = H.li $ do
      let ref = "graphs" </> n <.> "html"
      H.a ! A.href (toValue ref) $ toHtml n