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

import Control.Applicative ((<$>))
import Control.Monad (msum)
import Happstack.Server (FilterMonad, Response, ServerPart, nullConf, simpleHTTP, toResponse)
import Happstack.Facebook.Common (FacebookConfig(apiKey), HasFacebookConfig(askFacebookConfig), HasUser(askUser), FbXML(FbXML), User(uid))
import Happstack.Facebook.Connect (withFacebookConnect, withSessionSP)
import Happstack.Facebook.XdReceiver (fbInit, fbFeatureLoader, xdReceiverPart)
import HSP
import FacebookConfig (facebookConfig)
import qualified HSX.XMLGenerator as HSX

main :: IO ()
main = simpleHTTP nullConf impl

impl :: ServerPart Response
impl = 
    msum [ withFacebookConnect facebookConfig $ 
                               msum [ xdReceiverPart -- xd_receiver.htm
                                    , withSessionSP $ fbml (do user <- askUser
                                                               appTemplate "Members Area" () 
                                                                            <div>
                                                                              <h1>Welcome to the Members Area</h1>
                                                                              <p>Hello, <fb:name uid=(show $ uid user) useyou=False />.</p>            
                                                                              <p>You look like this <fb:profile-pic uid=(show $ uid user) facebook-logo=True />.</p>
                                                                            </div>
                                                           )
                                    , fbml (appTemplate "Login" ()
                                               <div>
                                                 <h1>Connect using Facebook Connect</h1>
                                                 <fb:login-button onlogin="facebook_onlogin();"></fb:login-button>
                                               </div>)
                                    ]
         ]

fbml :: 
    ( Functor m
    , FilterMonad Response m
    , XMLGenerator m
    ) 
    => XMLGenT m XML
    -> m Response
fbml xml = toResponse . FbXML <$> (unXMLGenT xml)

-- http://wiki.developers.facebook.com/index.php/Connect/Setting_Up_Your_Site
appTemplate :: 
    ( Functor m
    , HasFacebookConfig m
    , XMLGenerator m
    , EmbedAsChild m headers
    , EmbedAsChild m body
    , EmbedAsAttr m (Attr (String, String) String)
    ) 
    => String 
    -> headers 
    -> body 
    -> XMLGenT m (HSX.XML m)
appTemplate title headers body =
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml">
     <head>
       <% headers %>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
       <title><% title %></title>
     </head>
     <body>
      <% fbFeatureLoader %> -- enables XFBML, Facebook Javascript calls, etc
      <% body %>
      <% fbInit =<< (apiKey <$> askFacebookConfig) %> -- script which causes XFBML to be rendered
     </body>
    </html>

