module Test.WebDriver.Commands.Logs (
  -- * Main log retrieval functions
  withRecordLogsViaBiDi
  , withRecordLogsViaBiDi'

  , getLogs

  -- * Driver-specific implementations
  -- , getChromeLogs
  -- , getFirefoxLogs
  -- , getSeleniumLogs
  -- , getSeleniumLogTypes

  -- * Types
  , LogType
  , LogEntry(..)
  , LogLevel(..)
  ) where

import GHC.Stack
import Test.WebDriver.Commands.Logs.BiDi
import Test.WebDriver.Commands.Logs.Chrome
import Test.WebDriver.Commands.Logs.Common
import Test.WebDriver.Commands.Logs.Firefox
import Test.WebDriver.Commands.Logs.Selenium
import Test.WebDriver.Types


-- | Retrieve logs of a specific type from the browser. The W3C spec doesn't
-- define how to do this natively, so we automatically detect the browser and
-- try to use an appropriate method:
--
-- * Chrome/Chromium: Chrome DevTools Protocol (CDP)
-- * Firefox: legacy log endpoint (/log)
-- * Selenium: legacy log endpoint (/log)
-- * Other browsers: returns empty list
--
-- Common log types: @browser@, @driver@, @performance@, @server@.
--
-- However, the modern way to do this is via 'withRecordLogsViaBiDi'.
getLogs :: (HasCallStack, WebDriver wd) => LogType -> wd [LogEntry]
getLogs :: forall (wd :: * -> *).
(HasCallStack, WebDriver wd) =>
LogType -> wd [LogEntry]
getLogs LogType
logType = do
  Session { sessionDriver :: Session -> Driver
sessionDriver = Driver { _driverConfig :: Driver -> DriverConfig
_driverConfig = DriverConfig
driverConfig } } <- wd Session
forall (m :: * -> *). SessionState m => m Session
getSession
  case DriverConfig -> Maybe Browser
detectBrowserFromDriver DriverConfig
driverConfig of
    Just Browser
BrowserChrome -> LogType -> wd [LogEntry]
forall (wd :: * -> *).
(HasCallStack, WebDriver wd) =>
LogType -> wd [LogEntry]
getChromeLogs LogType
logType
    Just Browser
BrowserFirefox -> LogType -> wd [LogEntry]
forall (wd :: * -> *).
(HasCallStack, WebDriver wd) =>
LogType -> wd [LogEntry]
getFirefoxLogs LogType
logType
    Just Browser
BrowserSelenium -> LogType -> wd [LogEntry]
forall (wd :: * -> *).
(HasCallStack, WebDriver wd) =>
LogType -> wd [LogEntry]
getSeleniumLogs LogType
logType
    Maybe Browser
Nothing -> [LogEntry] -> wd [LogEntry]
forall a. a -> wd a
forall (m :: * -> *) a. Monad m => a -> m a
return [] -- Return empty for unsupported browsers