-- | This module provides a service for network connectivity.
module Navi.Services.Network.NetInterfaces
  ( toEvent,
  )
where

import Navi.Data.NaviNote
  ( NaviNote
      ( MkNaviNote,
        body,
        summary,
        timeout,
        urgency
      ),
  )
import Navi.Data.PollInterval (PollInterval (MkPollInterval))
import Navi.Event.Toml qualified as EventToml
import Navi.Event.Types
  ( AnyEvent (MkAnyEvent),
    Event
      ( MkEvent,
        errorNote,
        name,
        pollInterval,
        raiseAlert,
        repeatEvent,
        serviceType
      ),
  )
import Navi.Prelude
import Navi.Services.Network.NetInterfaces.Toml (NetInterfacesToml)
import Navi.Services.Types (ServiceType (NetworkInterface))
import Pythia.Services.NetInterface
  ( Device (..),
    NetInterface (..),
    NetInterfaceState (..),
  )

-- | Transforms toml configuration data into an 'AnyEvent'.
toEvent ::
  (MonadIORef m) =>
  NetInterfacesToml ->
  m AnyEvent
toEvent :: forall (m :: Type -> Type).
MonadIORef m =>
NetInterfacesToml -> m AnyEvent
toEvent NetInterfacesToml
toml = do
  RepeatEvent NetInterface
repeatEvent <- Maybe RepeatEventToml -> m (RepeatEvent NetInterface)
forall (m :: Type -> Type) a.
MonadIORef m =>
Maybe RepeatEventToml -> m (RepeatEvent a)
EventToml.mRepeatEventTomlToVal (Maybe RepeatEventToml -> m (RepeatEvent NetInterface))
-> Maybe RepeatEventToml -> m (RepeatEvent NetInterface)
forall a b. (a -> b) -> a -> b
$ NetInterfacesToml
toml NetInterfacesToml
-> Optic' A_Lens NoIx NetInterfacesToml (Maybe RepeatEventToml)
-> Maybe RepeatEventToml
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx NetInterfacesToml (Maybe RepeatEventToml)
#repeatEvent
  ErrorNote
errorNote <- Maybe ErrorNoteToml -> m ErrorNote
forall (m :: Type -> Type).
MonadIORef m =>
Maybe ErrorNoteToml -> m ErrorNote
EventToml.mErrorNoteTomlToVal (Maybe ErrorNoteToml -> m ErrorNote)
-> Maybe ErrorNoteToml -> m ErrorNote
forall a b. (a -> b) -> a -> b
$ NetInterfacesToml
toml NetInterfacesToml
-> Optic' A_Lens NoIx NetInterfacesToml (Maybe ErrorNoteToml)
-> Maybe ErrorNoteToml
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx NetInterfacesToml (Maybe ErrorNoteToml)
#errorNote
  pure
    $ Event NetInterface NetInterface -> AnyEvent
forall trigger result.
(Ord trigger, Show result, Show trigger) =>
Event result trigger -> AnyEvent
MkAnyEvent
    (Event NetInterface NetInterface -> AnyEvent)
-> Event NetInterface NetInterface -> AnyEvent
forall a b. (a -> b) -> a -> b
$ MkEvent
      { name :: Text
name = Text
"network-interface",
        serviceType :: ServiceType NetInterface
serviceType = ServiceType NetInterface
cmd,
        pollInterval :: PollInterval
pollInterval = PollInterval
pi,
        raiseAlert :: NetInterface -> Maybe (NetInterface, NaviNote)
raiseAlert = NetInterfacesToml -> NetInterface -> Maybe (NetInterface, NaviNote)
toNote NetInterfacesToml
toml,
        repeatEvent :: RepeatEvent NetInterface
repeatEvent = RepeatEvent NetInterface
repeatEvent,
        errorNote :: ErrorNote
errorNote = ErrorNote
errorNote
      }
  where
    device :: Device
device = Text -> Device
MkDevice (Text -> Device) -> Text -> Device
forall a b. (a -> b) -> a -> b
$ NetInterfacesToml
toml NetInterfacesToml
-> Optic' A_Lens NoIx NetInterfacesToml Text -> Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx NetInterfacesToml Text
#deviceName
    pi :: PollInterval
pi = PollInterval -> Maybe PollInterval -> PollInterval
forall a. a -> Maybe a -> a
fromMaybe (Natural -> PollInterval
MkPollInterval Natural
30) (NetInterfacesToml
toml NetInterfacesToml
-> Optic' A_Lens NoIx NetInterfacesToml (Maybe PollInterval)
-> Maybe PollInterval
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx NetInterfacesToml (Maybe PollInterval)
#pollInterval)
    cmd :: ServiceType NetInterface
cmd =
      Device -> NetInterfaceApp -> ServiceType NetInterface
NetworkInterface Device
device (NetInterfacesToml
toml NetInterfacesToml
-> Optic' A_Lens NoIx NetInterfacesToml NetInterfaceApp
-> NetInterfaceApp
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx NetInterfacesToml NetInterfaceApp
#app)
{-# INLINEABLE toEvent #-}

toNote :: NetInterfacesToml -> NetInterface -> Maybe (NetInterface, NaviNote)
toNote :: NetInterfacesToml -> NetInterface -> Maybe (NetInterface, NaviNote)
toNote NetInterfacesToml
noteToml NetInterface
conn =
  (NetInterface, NaviNote) -> Maybe (NetInterface, NaviNote)
forall a. a -> Maybe a
Just
    ( NetInterface
conn,
      MkNaviNote
        { summary :: Text
summary = Text
"Network Connectivity",
          body :: Maybe Text
body = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
body,
          urgency :: Maybe UrgencyLevel
urgency = Maybe UrgencyLevel
forall a. Maybe a
Nothing,
          timeout :: Maybe Timeout
timeout = NetInterfacesToml
noteToml NetInterfacesToml
-> Optic' A_Lens NoIx NetInterfacesToml (Maybe Timeout)
-> Maybe Timeout
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx NetInterfacesToml (Maybe Timeout)
#mTimeout
        }
    )
  where
    deviceTxt :: Text
deviceTxt = NetInterface
conn NetInterface -> Optic' A_Lens NoIx NetInterface Text -> Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. (Optic A_Lens NoIx NetInterface NetInterface Device Device
#device Optic A_Lens NoIx NetInterface NetInterface Device Device
-> Optic An_Iso NoIx Device Device Text Text
-> Optic' A_Lens NoIx NetInterface Text
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic An_Iso NoIx Device Device Text Text
#unDevice)
    nameTxt :: Text
nameTxt = Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"Unknown" (Maybe Text -> Text) -> Maybe Text -> Text
forall a b. (a -> b) -> a -> b
$ NetInterface
conn NetInterface
-> Optic' A_Lens NoIx NetInterface (Maybe Text) -> Maybe Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx NetInterface (Maybe Text)
#name
    body :: Text
body = Text
"Device " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
deviceTxt Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
stateTxt
    stateTxt :: Text
stateTxt = case NetInterface
conn NetInterface
-> Optic' A_Lens NoIx NetInterface NetInterfaceState
-> NetInterfaceState
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx NetInterface NetInterfaceState
#state of
      NetInterfaceState
NetStateUp -> Text
" is connected to: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
nameTxt
      NetInterfaceState
NetStateDown -> Text
" is disconnected from: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
nameTxt
      NetStateUnknown Text
txt -> Text
" is in an unknown state: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
txt