content: {-
    Copyright (c) Meta Platforms, Inc. and affiliates.
    All rights reserved.
  
    This source code is licensed under the BSD-style license found in the
    LICENSE file in the root directory of this source tree.
  -}
  
  {-# LANGUAGE RebindableSyntax, OverloadedStrings #-}
  module TestFB (main) where
  
  import Control.Exception as E
  import Data.Aeson
  import Data.HashMap.Strict ((!))
  import Data.Time.Calendar
  import Data.Time.Clock
  import FB
  import FB.DataSource
  import Haxl.Core
  import Haxl.Prelude
  import System.Environment
  import System.Exit
  import System.IO.Error
  import qualified Data.HashMap.Strict as HashMap
  import qualified Data.Text as T
  import qualified Data.Vector as Vector
  
  main = do
    (creds, access_token) <- getCredentials
    facebookState <- initGlobalState 10 creds access_token
    env <- initEnv (stateSet facebookState stateEmpty) ()
    r <- runHaxl env $ do
      likes <- getObject "me/likes"
      mapM getObject (likeIds likes)      -- these happen concurrently
    print r
  
  likeIds :: Object -> [Id]
  likeIds likes = do
    Array arr <- [likes ! "data"]
    Object obj <- Vector.toList arr
    String id <- [obj ! "id"]
    return (Id id)
  
  -- Modifed from the test in the fb package:
  -- https://github.com/meteficha/fb/blob/master/tests/Main.hs
  -- Copyright (c)2012, Felipe Lessa
  
  -- | Grab the Facebook credentials from the environment.
  getCredentials :: IO (Credentials, UserAccessToken)
  getCredentials = tryToGet `E.catch` showHelp
      where
        tryToGet = do
          [appName, appId, appSecret, accessToken] <-
             mapM getEnv ["APP_NAME", "APP_ID", "APP_SECRET", "ACCESS_TOKEN"]
          now <- getCurrentTime
          let creds = Credentials (T.pack appName)
                                  (T.pack appId)
                                  (T.pack appSecret)
              access_token = UserAccessToken
                               (Id "me")
                               (T.pack accessToken)
                               now
          return (creds, access_token)
  
        showHelp exc | not (isDoesNotExistError exc) = E.throw exc
        showHelp _ = do
          putStrLn $ unlines
            [ "In order to run the tests from the 'haxl-facebook' package, you"
            , "need developer access to a Facebook app.  Create an app by"
            , "going to http://developers.facebook.com, select \"Create a New"
            , " App\" from the \"Apps\" menu at the top.  Then create an"
            , "access token using the Graph API explorer:"
            , "   https://developers.facebook.com/tools/explorer"
            , "Select your app from the \"Application\" menu at the top, then hit"
            , "\"Get Access Token\".  The access token will last about 2 hours."
            , ""
            , "Please supply your app's name, id and secret in the environment"
            , "variables APP_NAME, APP_ID and APP_SECRET, respectively, and"
            , "the access token in ACCESS_TOKEN."
            , ""
            , "For example, before running the test you could run in the shell:"
            , ""
            , " $ export APP_NAME=\"test\""
            , " $ export APP_ID=\"000000000000000\""
            , " $ export APP_SECRET=\"xxxxxxxxxxxxxxxxxxxxxxxxxxxx\""
            , " $ export ACCESS_TOKEN=\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\""
            , ""
            , "Of course, these values above aren't valid and you need to"
            , "replace them with your own."
            , ""
            , "(Exiting now with a failure code.)"]
          exitFailure
  