{-# LANGUAGE CPP                  #-}
{-# LANGUAGE ExplicitForAll       #-}
{-# LANGUAGE ExtendedDefaultRules #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
module Shpadoinkle.Html.Utils where
import           Control.Monad                  (forM_)
import           Data.Text                      (Text)
import           GHCJS.DOM                      (currentDocumentUnchecked)
import           GHCJS.DOM.Document             as Doc (createElement,
                                                        createTextNode,
                                                        getBodyUnsafe,
                                                        getHeadUnsafe, setTitle)
import           GHCJS.DOM.Element              (setAttribute, setInnerHTML)
import           GHCJS.DOM.Node                 (appendChild)
import           GHCJS.DOM.NonElementParentNode (getElementById)
import           GHCJS.DOM.Types                (ToJSString, liftJSM, toJSVal)
import           Shpadoinkle                    (MonadJSM, RawNode (RawNode))
default (Text)
addStyle
  :: MonadJSM m
  => Text
  
  -> m ()
addStyle x = do
  doc <- currentDocumentUnchecked
  link <- createElement doc "link"
  setAttribute link "href" x
  setAttribute link "rel" "stylesheet"
  headRaw <- Doc.getHeadUnsafe doc
  () <$ appendChild headRaw link
addInlineStyle :: ToJSString css => MonadJSM m => css -> m ()
addInlineStyle bs = do
  doc <- currentDocumentUnchecked
  style <- createElement doc "style"
  setInnerHTML style bs
  headRaw <- Doc.getHeadUnsafe doc
  () <$ appendChild headRaw style
setTitle :: MonadJSM m => Text -> m ()
setTitle t = do
  doc <- currentDocumentUnchecked
  Doc.setTitle doc t
getBody :: MonadJSM m => m RawNode
getBody = do
  doc <- currentDocumentUnchecked
  body <- Doc.getBodyUnsafe doc
  setInnerHTML body ""
  liftJSM $ RawNode <$> toJSVal body
addMeta :: MonadJSM m => [(Text, Text)] -> m ()
addMeta ps = liftJSM $ do
  doc <- currentDocumentUnchecked
  tag <- createElement doc ("meta" :: Text)
  forM_ ps $ uncurry (setAttribute tag)
  headRaw <- Doc.getHeadUnsafe doc
  () <$ appendChild headRaw tag
createDivWithId :: MonadJSM m => Text -> m ()
createDivWithId did = liftJSM $ do
  doc <- currentDocumentUnchecked
  tag <- createElement doc ("div" :: Text)
  setAttribute tag "id" did
  body <- Doc.getHeadUnsafe doc
  () <$ appendChild body tag
addScriptSrc :: MonadJSM m => Text -> m ()
addScriptSrc src = liftJSM $ do
  doc <- currentDocumentUnchecked
  tag <- createElement doc ("script" :: Text)
  setAttribute tag ("src" :: Text) src
  headRaw <- Doc.getHeadUnsafe doc
  () <$ appendChild headRaw tag
addScriptText :: MonadJSM m => Text -> m ()
addScriptText js = liftJSM $ do
  doc <- currentDocumentUnchecked
  tag <- createElement doc ("script" :: Text)
  setAttribute tag ("type" :: Text) ("text/javascript" :: Text)
  headRaw <- Doc.getHeadUnsafe doc
  jsn <- createTextNode doc js
  _ <- appendChild tag jsn
  () <$ appendChild headRaw tag
getById :: MonadJSM m => Text -> m RawNode
getById did = liftJSM $ do
  doc <- currentDocumentUnchecked
  fmap RawNode . toJSVal =<< getElementById doc did
treatEmpty :: Foldable f => Functor f => a -> (f a -> a) -> (b -> a) -> f b -> a
treatEmpty zero plural singular xs = if Prelude.null xs then zero else plural $ singular <$> xs