{-# LANGUAGE BangPatterns, DeriveDataTypeable, DeriveGeneric,
  FlexibleInstances, MultiParamTypeClasses #-}

module Network.Monitoring.Riemann.Proto.Msg
  ( Msg(..)
  ) where

import qualified Data.Data as Prelude'
import qualified GHC.Generics as Prelude'
import qualified Network.Monitoring.Riemann.Proto.Event as Proto (Event)
import qualified Network.Monitoring.Riemann.Proto.Query as Proto (Query)
import qualified Network.Monitoring.Riemann.Proto.State as Proto (State)
import Prelude ((+))
import qualified Prelude as Prelude'
import qualified Text.ProtocolBuffers.Header as P'

data Msg = Msg
  { ok :: !(P'.Maybe P'.Bool)
  , error :: !(P'.Maybe P'.Utf8)
  , states :: !(P'.Seq Proto.State)
  , query :: !(P'.Maybe Proto.Query)
  , events :: !(P'.Seq Proto.Event)
  } deriving ( Prelude'.Show
             , Prelude'.Eq
             , Prelude'.Ord
             , Prelude'.Typeable
             , Prelude'.Data
             , Prelude'.Generic
             )

instance P'.Mergeable Msg where
  mergeAppend (Msg x'1 x'2 x'3 x'4 x'5) (Msg y'1 y'2 y'3 y'4 y'5) =
    Msg
      (P'.mergeAppend x'1 y'1)
      (P'.mergeAppend x'2 y'2)
      (P'.mergeAppend x'3 y'3)
      (P'.mergeAppend x'4 y'4)
      (P'.mergeAppend x'5 y'5)

instance P'.Default Msg where
  defaultValue =
    Msg
      P'.defaultValue
      P'.defaultValue
      P'.defaultValue
      P'.defaultValue
      P'.defaultValue

instance P'.Wire Msg where
  wireSize ft' self'@(Msg x'1 x'2 x'3 x'4 x'5) =
    case ft' of
      10 -> calc'Size
      11 -> P'.prependMessageSize calc'Size
      _ -> P'.wireSizeErr ft' self'
    where
      calc'Size =
        P'.wireSizeOpt 1 8 x'1 + P'.wireSizeOpt 1 9 x'2 +
        P'.wireSizeRep 1 11 x'3 +
        P'.wireSizeOpt 1 11 x'4 +
        P'.wireSizeRep 1 11 x'5
  wirePut ft' self'@(Msg x'1 x'2 x'3 x'4 x'5) =
    case ft' of
      10 -> put'Fields
      11 -> do
        P'.putSize (P'.wireSize 10 self')
        put'Fields
      _ -> P'.wirePutErr ft' self'
    where
      put'Fields = do
        P'.wirePutOpt 16 8 x'1
        P'.wirePutOpt 26 9 x'2
        P'.wirePutRep 34 11 x'3
        P'.wirePutOpt 42 11 x'4
        P'.wirePutRep 50 11 x'5
  wireGet ft' =
    case ft' of
      10 -> P'.getBareMessageWith update'Self
      11 -> P'.getMessageWith update'Self
      _ -> P'.wireGetErr ft'
    where
      update'Self wire'Tag old'Self =
        case wire'Tag of
          16 ->
            Prelude'.fmap
              (\ !new'Field -> old'Self {ok = Prelude'.Just new'Field})
              (P'.wireGet 8)
          26 ->
            Prelude'.fmap
              (\ !new'Field -> old'Self {error = Prelude'.Just new'Field})
              (P'.wireGet 9)
          34 ->
            Prelude'.fmap
              (\ !new'Field ->
                 old'Self {states = P'.append (states old'Self) new'Field})
              (P'.wireGet 11)
          42 ->
            Prelude'.fmap
              (\ !new'Field ->
                 old'Self
                   { query =
                       P'.mergeAppend (query old'Self) (Prelude'.Just new'Field)
                   })
              (P'.wireGet 11)
          50 ->
            Prelude'.fmap
              (\ !new'Field ->
                 old'Self {events = P'.append (events old'Self) new'Field})
              (P'.wireGet 11)
          _ ->
            let (field'Number, wire'Type) = P'.splitWireTag wire'Tag
             in P'.unknown field'Number wire'Type old'Self

instance P'.MessageAPI msg' (msg' -> Msg) Msg where
  getVal m' f' = f' m'

instance P'.GPB Msg

instance P'.ReflectDescriptor Msg where
  getMessageInfo _ =
    P'.GetMessageInfo
      (P'.fromDistinctAscList [])
      (P'.fromDistinctAscList [16, 26, 34, 42, 50])
  reflectDescriptorInfo _ =
    Prelude'.read
      "DescriptorInfo {descName = ProtoName {protobufName = FIName \".Proto.Msg\", haskellPrefix = [MName \"Network\",MName \"Monitoring\",MName \"Riemann\"], parentModule = [MName \"Proto\"], baseName = MName \"Msg\"}, descFilePath = [\"Network\",\"Monitoring\",\"Riemann\",\"Proto\",\"Msg.hs\"], isGroup = False, fields = fromList [FieldInfo {fieldName = ProtoFName {protobufName' = FIName \".Proto.Msg.ok\", haskellPrefix' = [MName \"Network\",MName \"Monitoring\",MName \"Riemann\"], parentModule' = [MName \"Proto\",MName \"Msg\"], baseName' = FName \"ok\", baseNamePrefix' = \"\"}, fieldNumber = FieldId {getFieldId = 2}, wireTag = WireTag {getWireTag = 16}, packedTag = Nothing, wireTagLength = 1, isPacked = False, isRequired = False, canRepeat = False, mightPack = False, typeCode = FieldType {getFieldType = 8}, typeName = Nothing, hsRawDefault = Nothing, hsDefault = Nothing},FieldInfo {fieldName = ProtoFName {protobufName' = FIName \".Proto.Msg.error\", haskellPrefix' = [MName \"Network\",MName \"Monitoring\",MName \"Riemann\"], parentModule' = [MName \"Proto\",MName \"Msg\"], baseName' = FName \"error\", baseNamePrefix' = \"\"}, fieldNumber = FieldId {getFieldId = 3}, wireTag = WireTag {getWireTag = 26}, packedTag = Nothing, wireTagLength = 1, isPacked = False, isRequired = False, canRepeat = False, mightPack = False, typeCode = FieldType {getFieldType = 9}, typeName = Nothing, hsRawDefault = Nothing, hsDefault = Nothing},FieldInfo {fieldName = ProtoFName {protobufName' = FIName \".Proto.Msg.states\", haskellPrefix' = [MName \"Network\",MName \"Monitoring\",MName \"Riemann\"], parentModule' = [MName \"Proto\",MName \"Msg\"], baseName' = FName \"states\", baseNamePrefix' = \"\"}, fieldNumber = FieldId {getFieldId = 4}, wireTag = WireTag {getWireTag = 34}, packedTag = Nothing, wireTagLength = 1, isPacked = False, isRequired = False, canRepeat = True, mightPack = False, typeCode = FieldType {getFieldType = 11}, typeName = Just (ProtoName {protobufName = FIName \".Proto.State\", haskellPrefix = [MName \"Network\",MName \"Monitoring\",MName \"Riemann\"], parentModule = [MName \"Proto\"], baseName = MName \"State\"}), hsRawDefault = Nothing, hsDefault = Nothing},FieldInfo {fieldName = ProtoFName {protobufName' = FIName \".Proto.Msg.query\", haskellPrefix' = [MName \"Network\",MName \"Monitoring\",MName \"Riemann\"], parentModule' = [MName \"Proto\",MName \"Msg\"], baseName' = FName \"query\", baseNamePrefix' = \"\"}, fieldNumber = FieldId {getFieldId = 5}, wireTag = WireTag {getWireTag = 42}, packedTag = Nothing, wireTagLength = 1, isPacked = False, isRequired = False, canRepeat = False, mightPack = False, typeCode = FieldType {getFieldType = 11}, typeName = Just (ProtoName {protobufName = FIName \".Proto.Query\", haskellPrefix = [MName \"Network\",MName \"Monitoring\",MName \"Riemann\"], parentModule = [MName \"Proto\"], baseName = MName \"Query\"}), hsRawDefault = Nothing, hsDefault = Nothing},FieldInfo {fieldName = ProtoFName {protobufName' = FIName \".Proto.Msg.events\", haskellPrefix' = [MName \"Network\",MName \"Monitoring\",MName \"Riemann\"], parentModule' = [MName \"Proto\",MName \"Msg\"], baseName' = FName \"events\", baseNamePrefix' = \"\"}, fieldNumber = FieldId {getFieldId = 6}, wireTag = WireTag {getWireTag = 50}, packedTag = Nothing, wireTagLength = 1, isPacked = False, isRequired = False, canRepeat = True, mightPack = False, typeCode = FieldType {getFieldType = 11}, typeName = Just (ProtoName {protobufName = FIName \".Proto.Event\", haskellPrefix = [MName \"Network\",MName \"Monitoring\",MName \"Riemann\"], parentModule = [MName \"Proto\"], baseName = MName \"Event\"}), hsRawDefault = Nothing, hsDefault = Nothing}], descOneofs = fromList [], keys = fromList [], extRanges = [], knownKeys = fromList [], storeUnknown = False, lazyFields = False, makeLenses = False}"

instance P'.TextType Msg where
  tellT = P'.tellSubMessage
  getT = P'.getSubMessage

instance P'.TextMsg Msg where
  textPut msg = do
    P'.tellT "ok" (ok msg)
    P'.tellT "error" (error msg)
    P'.tellT "states" (states msg)
    P'.tellT "query" (query msg)
    P'.tellT "events" (events msg)
  textGet = do
    mods <-
      P'.sepEndBy
        (P'.choice
           [parse'ok, parse'error, parse'states, parse'query, parse'events])
        P'.spaces
    Prelude'.return (Prelude'.foldl (\v f -> f v) P'.defaultValue mods)
    where
      parse'ok =
        P'.try
          (do v <- P'.getT "ok"
              Prelude'.return (\o -> o {ok = v}))
      parse'error =
        P'.try
          (do v <- P'.getT "error"
              Prelude'.return (\o -> o {error = v}))
      parse'states =
        P'.try
          (do v <- P'.getT "states"
              Prelude'.return (\o -> o {states = P'.append (states o) v}))
      parse'query =
        P'.try
          (do v <- P'.getT "query"
              Prelude'.return (\o -> o {query = v}))
      parse'events =
        P'.try
          (do v <- P'.getT "events"
              Prelude'.return (\o -> o {events = P'.append (events o) v}))