module Test.WebDriver.Commands.Navigation (
  openPage
  , getCurrentURL
  , back
  , forward
  , refresh
  , getTitle
  ) where

import Data.Aeson as A
import Data.Text (Text)
import GHC.Stack
import Network.URI hiding (path)  -- suppresses warnings
import Prelude -- hides some "unused import" warnings
import Test.WebDriver.Exceptions
import Test.WebDriver.JSON
import Test.WebDriver.Types
import Test.WebDriver.Util.Commands
import UnliftIO.Exception (throwIO)


-- | Opens a new page by the given URL.
openPage :: (HasCallStack, WebDriver wd) => String -> wd ()
openPage :: forall (wd :: * -> *).
(HasCallStack, WebDriver wd) =>
String -> wd ()
openPage String
url
  | String -> Bool
isURI String
url = wd NoReturn -> wd ()
forall (m :: * -> *). WebDriver m => m NoReturn -> m ()
noReturn (wd NoReturn -> wd ())
-> (String -> wd NoReturn) -> String -> wd ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Method -> Text -> Value -> wd NoReturn
forall (wd :: * -> *) a b.
(HasCallStack, WebDriver wd, ToJSON a, FromJSON b) =>
Method -> Text -> a -> wd b
doSessCommand Method
methodPost Text
"/url" (Value -> wd NoReturn)
-> (String -> Value) -> String -> wd NoReturn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String -> Value
forall a. ToJSON a => Text -> a -> Value
single Text
"url" (String -> wd ()) -> String -> wd ()
forall a b. (a -> b) -> a -> b
$ String
url
  | Bool
otherwise = InvalidURL -> wd ()
forall (m :: * -> *) e a. (MonadIO m, Exception e) => e -> m a
throwIO (InvalidURL -> wd ()) -> (String -> InvalidURL) -> String -> wd ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> InvalidURL
InvalidURL (String -> wd ()) -> String -> wd ()
forall a b. (a -> b) -> a -> b
$ String
url

-- | Gets the URL of the current page.
getCurrentURL :: (HasCallStack, WebDriver wd) => wd String
getCurrentURL :: forall (wd :: * -> *). (HasCallStack, WebDriver wd) => wd String
getCurrentURL = Method -> Text -> Value -> wd String
forall (wd :: * -> *) a b.
(HasCallStack, WebDriver wd, ToJSON a, FromJSON b) =>
Method -> Text -> a -> wd b
doSessCommand Method
methodGet Text
"/url" Value
Null

-- | Navigate backward in the browser history.
back :: (HasCallStack, WebDriver wd) => wd ()
back :: forall (wd :: * -> *). (HasCallStack, WebDriver wd) => wd ()
back = wd NoReturn -> wd ()
forall (m :: * -> *). WebDriver m => m NoReturn -> m ()
noReturn (wd NoReturn -> wd ()) -> wd NoReturn -> wd ()
forall a b. (a -> b) -> a -> b
$ Method -> Text -> Value -> wd NoReturn
forall (wd :: * -> *) a b.
(HasCallStack, WebDriver wd, ToJSON a, FromJSON b) =>
Method -> Text -> a -> wd b
doSessCommand Method
methodPost Text
"/back" Value
noObject

-- | Navigate forward in the browser history.
forward :: (HasCallStack, WebDriver wd) => wd ()
forward :: forall (wd :: * -> *). (HasCallStack, WebDriver wd) => wd ()
forward = wd NoReturn -> wd ()
forall (m :: * -> *). WebDriver m => m NoReturn -> m ()
noReturn (wd NoReturn -> wd ()) -> wd NoReturn -> wd ()
forall a b. (a -> b) -> a -> b
$ Method -> Text -> Value -> wd NoReturn
forall (wd :: * -> *) a b.
(HasCallStack, WebDriver wd, ToJSON a, FromJSON b) =>
Method -> Text -> a -> wd b
doSessCommand Method
methodPost Text
"/forward" Value
noObject

-- | Refresh the current page
refresh :: (HasCallStack, WebDriver wd) => wd ()
refresh :: forall (wd :: * -> *). (HasCallStack, WebDriver wd) => wd ()
refresh = wd NoReturn -> wd ()
forall (m :: * -> *). WebDriver m => m NoReturn -> m ()
noReturn (wd NoReturn -> wd ()) -> wd NoReturn -> wd ()
forall a b. (a -> b) -> a -> b
$ Method -> Text -> Value -> wd NoReturn
forall (wd :: * -> *) a b.
(HasCallStack, WebDriver wd, ToJSON a, FromJSON b) =>
Method -> Text -> a -> wd b
doSessCommand Method
methodPost Text
"/refresh" Value
noObject

-- | Get the title of the current page.
getTitle :: (HasCallStack, WebDriver wd) => wd Text
getTitle :: forall (wd :: * -> *). (HasCallStack, WebDriver wd) => wd Text
getTitle = Method -> Text -> Value -> wd Text
forall (wd :: * -> *) a b.
(HasCallStack, WebDriver wd, ToJSON a, FromJSON b) =>
Method -> Text -> a -> wd b
doSessCommand Method
methodGet Text
"/title" Value
Null