{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE NamedFieldPuns    #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PackageImports    #-}

--------------------------------------------------------------------------------

-- Orphan instances module for Cardano tracer.
{-# OPTIONS_GHC -Wno-orphans #-}
-- Extracted from "cardano-node" `Cardano.Node.Tracing.Tracers.P2P`.
-- Branch "master" (2026-02-11, 85869e9dd21d9dac7c4381418346e97259c3303b).

{- TODO: All references to package "cardano-diffusion" were removed.
--       See all the TODO annotations.
import           "cardano-diffusion" -- "cardano-diffusion:???"
  Cardano.Network.PeerSelection.Governor.Monitor
    ( ExtraTrace (TraceLedgerStateJudgementChanged, TraceUseBootstrapPeersChanged)
    )
--}

--------------------------------------------------------------------------------

module Ouroboros.Network.Tracing.PeerSelection.Governor.DebugPeerSelection () where

--------------------------------------------------------------------------------

---------
-- base -
---------
--
---------------------
-- Package: "aeson" -
---------------------
import "aeson" Data.Aeson (Value (String), (.=))
-----------------------
-- Package: "network" -
-----------------------
import "network" Network.Socket (SockAddr)
---------------------------------
-- Package: "ouroboros-network" -
---------------------------------
import "ouroboros-network" Ouroboros.Network.PeerSelection.Governor.Types
           (DebugPeerSelection (..), PeerSelectionState (..))
--------------------
-- Package: "text" -
--------------------
import "text" Data.Text (pack)
--------------------------------
-- Package: "trace-dispatcher" -
--------------------------------
import "trace-dispatcher" Cardano.Logging
---------
-- Self -
---------
import Ouroboros.Network.Tracing.PeerSelection.Governor.Utils
           (peerSelectionTargetsToObject)

--------------------------------------------------------------------------------
-- DebugPeerSelection Tracer
--------------------------------------------------------------------------------

{-- TODO: Before "cardano-diffusion" removal:
instance LogFormatting (DebugPeerSelection Cardano.ExtraState PeerTrustable (Cardano.PublicRootPeers.ExtraPeers SockAddr) SockAddr) where
 -- TODO: That later changed in f550a6eb503cc81807419795ab2360e6042ce9d5:
instance LogFormatting CardanoDebugPeerSelection where
--}
instance ( Show extraState
         , Show extraFlags
         , Show extraPeers
         )
      => LogFormatting (DebugPeerSelection extraState extraFlags extraPeers SockAddr) where
  forMachine :: DetailLevel
-> DebugPeerSelection extraState extraFlags extraPeers SockAddr
-> Object
forMachine _dtal :: DetailLevel
_dtal@DetailLevel
DNormal (TraceGovernorState Time
blockedAt Maybe DiffTime
wakeupAfter
                   _st :: PeerSelectionState
  extraState extraFlags extraPeers SockAddr peerconn
_st@PeerSelectionState { PeerSelectionTargets
targets :: PeerSelectionTargets
targets :: forall extraState extraFlags extraPeers peeraddr peerconn.
PeerSelectionState
  extraState extraFlags extraPeers peeraddr peerconn
-> PeerSelectionTargets
targets }) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"DebugPeerSelection"
             , Key
"blockedAt" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Time -> String
forall a. Show a => a -> String
show Time
blockedAt)
             , Key
"wakeupAfter" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Maybe DiffTime -> String
forall a. Show a => a -> String
show Maybe DiffTime
wakeupAfter)
             , Key
"targets" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= PeerSelectionTargets -> Value
peerSelectionTargetsToObject PeerSelectionTargets
targets
{-- TODO: Before "cardano-diffusion" removal:

             , "counters" .= forMachine dtal (peerSelectionStateToCounters Cardano.PublicRootPeers.toSet Cardano.cardanoPeerSelectionStatetoCounters st)
--}
             ]
  forMachine DetailLevel
_ (TraceGovernorState Time
blockedAt Maybe DiffTime
wakeupAfter PeerSelectionState
  extraState extraFlags extraPeers SockAddr peerconn
ev) =
    [Object] -> Object
forall a. Monoid a => [a] -> a
mconcat [ Key
"kind" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String Text
"DebugPeerSelection"
             , Key
"blockedAt" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Time -> String
forall a. Show a => a -> String
show Time
blockedAt)
             , Key
"wakeupAfter" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Maybe DiffTime -> String
forall a. Show a => a -> String
show Maybe DiffTime
wakeupAfter)
             , Key
"peerSelectionState" Key -> Value -> Object
forall v. ToJSON v => Key -> v -> Object
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text -> Value
String (String -> Text
pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ PeerSelectionState
  extraState extraFlags extraPeers SockAddr peerconn
-> String
forall a. Show a => a -> String
show PeerSelectionState
  extraState extraFlags extraPeers SockAddr peerconn
ev)
             ]
  forHuman :: DebugPeerSelection extraState extraFlags extraPeers SockAddr
-> Text
forHuman = String -> Text
pack (String -> Text)
-> (DebugPeerSelection extraState extraFlags extraPeers SockAddr
    -> String)
-> DebugPeerSelection extraState extraFlags extraPeers SockAddr
-> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DebugPeerSelection extraState extraFlags extraPeers SockAddr
-> String
forall a. Show a => a -> String
show

instance MetaTrace (DebugPeerSelection extraState extraFlags extraPeers SockAddr) where
    namespaceFor :: DebugPeerSelection extraState extraFlags extraPeers SockAddr
-> Namespace
     (DebugPeerSelection extraState extraFlags extraPeers SockAddr)
namespaceFor TraceGovernorState {} = [Text]
-> [Text]
-> Namespace
     (DebugPeerSelection extraState extraFlags extraPeers SockAddr)
forall a. [Text] -> [Text] -> Namespace a
Namespace [] [Text
"GovernorState"]

    severityFor :: Namespace
  (DebugPeerSelection extraState extraFlags extraPeers SockAddr)
-> Maybe
     (DebugPeerSelection extraState extraFlags extraPeers SockAddr)
-> Maybe SeverityS
severityFor (Namespace [Text]
_ [Text
"GovernorState"]) Maybe
  (DebugPeerSelection extraState extraFlags extraPeers SockAddr)
_ = SeverityS -> Maybe SeverityS
forall a. a -> Maybe a
Just SeverityS
Debug
    severityFor Namespace
  (DebugPeerSelection extraState extraFlags extraPeers SockAddr)
_ Maybe
  (DebugPeerSelection extraState extraFlags extraPeers SockAddr)
_                               = Maybe SeverityS
forall a. Maybe a
Nothing

    documentFor :: Namespace
  (DebugPeerSelection extraState extraFlags extraPeers SockAddr)
-> Maybe Text
documentFor (Namespace [Text]
_ [Text
"GovernorState"]) = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
""
    documentFor Namespace
  (DebugPeerSelection extraState extraFlags extraPeers SockAddr)
_                               = Maybe Text
forall a. Maybe a
Nothing

    allNamespaces :: [Namespace
   (DebugPeerSelection extraState extraFlags extraPeers SockAddr)]
allNamespaces = [
      [Text]
-> [Text]
-> Namespace
     (DebugPeerSelection extraState extraFlags extraPeers SockAddr)
forall a. [Text] -> [Text] -> Namespace a
Namespace [] [Text
"GovernorState"]
      ]