{-# OPTIONS_GHC -F -pgmFtrhsx #-}
module Main where

import Control.Concurrent (forkIO, killThread)
import Control.Monad (MonadPlus(mzero), msum)
import Control.Monad.Trans (lift, liftIO)
import Happstack.State (waitForTermination)
import Happstack.Server
import HSP
import Happstack.Facebook
-- import Config (facebookConfig) -- you need to edit Config.hs first and add your app information
import HacketeriaConfig
import Text.RJson (fromJsonString)

conf :: Conf
conf = nullConf { port = 8000 }

main :: IO ()
main = 
    do tid <- forkIO $ simpleHTTP conf (impl facebookConfig)
       putStrLn "running..."
       waitForTermination
       killThread tid


impl :: FacebookConfig -> ServerPartT IO Response
impl fbConfig = msum
    [ withRequest $ \rq -> liftIO (print rq) >> mzero -- prints out the requests for debug purposes
    , withFacebook fbConfig $
                   anyRequest $ ok . toResponse =<< lift hello 
    -- , debug404
    ]



hello :: Facebook XML
hello = 
    <fb:fbml  version="1.0">
     You <% fb_sig_added >>= \r -> return (if r then " have " else " have not ") %> added my app.
     Your name is <fb:name uid=(fmap (maybe "unknown" (show .uid)) fb_user) capitalize="true" useyou="false" />. 
     You look like this: <fb:profile-pic uid="loggedinuser" />
     Your session key is <% fb_sig_session_key >>= return . show %>
     <fb:prompt-permission perms="status_update">
      Please let us set your status! Please!!
     </fb:prompt-permission>
     -- Updating your status returned: <% callMethod (StatusSet"is hoping this works.") %>
     Publishing a one-lines story returned. <% callMethod (FeedPublishUserAction (bundles!!0) [] Nothing) %>
      -- <% friendPics %>
    </fb:fbml>

friendPics :: Facebook [XML]
friendPics =
    do res <- execRequest =<< buildRequest [ ("method", "friends.get") ]
       let (Right uids) = fromJsonString (undefined :: [Integer]) res
       mapM (\uid -> <fb:profile-pic uid=(show uid) />) uids

