module Network.Bugsnag.Device
  ( bugsnagDeviceFromUserAgent
  ) where

import Prelude

import Data.Bugsnag
import Data.ByteString (ByteString)
import Data.Text (pack, unpack)
import Data.Version
import Text.Read (readMaybe)
import Web.UAParser

bugsnagDeviceFromUserAgent :: ByteString -> Device
bugsnagDeviceFromUserAgent :: ByteString -> Device
bugsnagDeviceFromUserAgent ByteString
userAgent =
  Device
defaultDevice
    { device_osName :: Maybe Text
device_osName = OSResult -> Text
osrFamily forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe OSResult
osResult
    , device_osVersion :: Maybe Text
device_osVersion = do
        OSResult
result <- Maybe OSResult
osResult
        Int
v1 <- forall a. Read a => String -> Maybe a
readMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< OSResult -> Maybe Text
osrV1 OSResult
result
        Int
v2 <- forall a. Read a => String -> Maybe a
readMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< OSResult -> Maybe Text
osrV2 OSResult
result
        Int
v3 <- forall a. Read a => String -> Maybe a
readMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< OSResult -> Maybe Text
osrV3 OSResult
result
        Int
v4 <- forall a. Read a => String -> Maybe a
readMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< OSResult -> Maybe Text
osrV4 OSResult
result
        forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ String -> Text
pack forall a b. (a -> b) -> a -> b
$ Version -> String
showVersion forall a b. (a -> b) -> a -> b
$ [Int] -> Version
makeVersion [Int
v1, Int
v2, Int
v3, Int
v4]
    , device_browserName :: Maybe Text
device_browserName = UAResult -> Text
uarFamily forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe UAResult
uaResult
    , device_browserVersion :: Maybe Text
device_browserVersion = do
        UAResult
result <- Maybe UAResult
uaResult
        Int
v1 <- forall a. Read a => String -> Maybe a
readMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< UAResult -> Maybe Text
uarV1 UAResult
result
        Int
v2 <- forall a. Read a => String -> Maybe a
readMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< UAResult -> Maybe Text
uarV2 UAResult
result
        Int
v3 <- forall a. Read a => String -> Maybe a
readMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< UAResult -> Maybe Text
uarV3 UAResult
result
        forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ String -> Text
pack forall a b. (a -> b) -> a -> b
$ Version -> String
showVersion forall a b. (a -> b) -> a -> b
$ [Int] -> Version
makeVersion [Int
v1, Int
v2, Int
v3]
    }
 where
  uaResult :: Maybe UAResult
uaResult = ByteString -> Maybe UAResult
parseUA ByteString
userAgent
  osResult :: Maybe OSResult
osResult = ByteString -> Maybe OSResult
parseOS ByteString
userAgent