{-# LANGUAGE OverloadedStrings #-}

module OpenTok
  ( OpenTok(apiKey, secret)
  , opentok
  , createSession
  , generateToken
  , Token
  , Role(..)
  , TokenOptions(..)
  , tokenOpts
  , startArchive
  , stopArchive
  , listArchives
  , deleteArchive
  )
where

import           Prelude                        ( )
import           Prelude.Compat
import           Data.Semigroup                 ( (<>) )

import           OpenTok.Archive
import           OpenTok.Session
import           OpenTok.Token
import           OpenTok.Client
import           OpenTok.Types

-- | Represents an OpenTok project.
--
-- Get your project key and secret from https://tokbox.com/account/
data OpenTok = OpenTok {
  apiKey :: APIKey,
  secret :: APISecret,
  client :: Client
}

instance Show OpenTok where
  show ot = "OpenTok { APIKey: " <> OpenTok.apiKey ot <> ", Secret: *_*_*_*_*_*  }"

-- | Get an OpenTok project
--
-- > ot = opentok "my_api_key" "my_api_secret"
--
opentok :: APIKey -> APISecret -> OpenTok
opentok k s = OpenTok k s (OpenTok.Client.Client k s)

-- | Create a new OpenTok Session
--
-- @
-- options = sessionOpts { mediaMode = Routed }
-- session <- createSession ot sessionOpts
-- @
--
createSession :: OpenTok -> SessionOptions -> IO (Either OTError Session)
createSession ot = OpenTok.Session.create (client ot)

-- | Generate a token.
--
-- @
-- let options = tokenOpts { connectionData = "name:tim" }
-- token <- generateToken ot options
-- @
--
generateToken :: OpenTok -> SessionId -> TokenOptions -> IO (Either OTError Token)
generateToken ot = OpenTok.Token.generate (OpenTok.apiKey ot) (OpenTok.secret ot)

-- | Start recording an archive of an OpenTok session
--
-- > startArchive ot archiveOpts { sessionId = "your_session_id" }
--
startArchive :: OpenTok -> ArchiveOptions -> IO (Either OTError Archive)
startArchive ot = OpenTok.Archive.start (client ot)


-- | Stop recording an archive of an OpenTok session
--
-- > stopArchive ot "your_session_id"
--
stopArchive :: OpenTok -> ArchiveId -> IO (Either OTError Archive)
stopArchive ot = OpenTok.Archive.stop (client ot)

-- | Get a list of all archives for a project or a single session
--
-- > listArchives ot listArchiveOpts { _forSessionId = "some_session_id" }
--
listArchives :: OpenTok -> ListArchiveOptions -> IO (Either OTError ArchiveCollection)
listArchives ot = OpenTok.Archive.list (client ot)

-- | Delete an Archive
--
-- > deleteArchive ot "some_archive_id"
--
deleteArchive :: OpenTok -> ArchiveId -> IO (Either OTError ArchiveId)
deleteArchive ot = OpenTok.Archive.delete (client ot)