{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)

This is the struct that describes the categories. Once initialized with
@/GST_DEBUG_CATEGORY_INIT/@, its values can\'t be changed anymore.
-}

module GI.Gst.Structs.DebugCategory
    ( 

-- * Exported types
    DebugCategory(..)                       ,
    newZeroDebugCategory                    ,
    noDebugCategory                         ,


 -- * Methods
-- ** free #method:free#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    DebugCategoryFreeMethodInfo             ,
#endif
    debugCategoryFree                       ,


-- ** getColor #method:getColor#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    DebugCategoryGetColorMethodInfo         ,
#endif
    debugCategoryGetColor                   ,


-- ** getDescription #method:getDescription#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    DebugCategoryGetDescriptionMethodInfo   ,
#endif
    debugCategoryGetDescription             ,


-- ** getName #method:getName#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    DebugCategoryGetNameMethodInfo          ,
#endif
    debugCategoryGetName                    ,


-- ** getThreshold #method:getThreshold#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    DebugCategoryGetThresholdMethodInfo     ,
#endif
    debugCategoryGetThreshold               ,


-- ** resetThreshold #method:resetThreshold#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    DebugCategoryResetThresholdMethodInfo   ,
#endif
    debugCategoryResetThreshold             ,


-- ** setThreshold #method:setThreshold#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    DebugCategorySetThresholdMethodInfo     ,
#endif
    debugCategorySetThreshold               ,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP

import {-# SOURCE #-} qualified GI.Gst.Enums as Gst.Enums

newtype DebugCategory = DebugCategory (ManagedPtr DebugCategory)
instance WrappedPtr DebugCategory where
    wrappedPtrCalloc = callocBytes 24
    wrappedPtrCopy = \p -> withManagedPtr p (copyBytes 24 >=> wrapPtr DebugCategory)
    wrappedPtrFree = Just ptr_to_g_free

-- | Construct a `DebugCategory` struct initialized to zero.
newZeroDebugCategory :: MonadIO m => m DebugCategory
newZeroDebugCategory = liftIO $ wrappedPtrCalloc >>= wrapPtr DebugCategory

instance tag ~ 'AttrSet => Constructible DebugCategory tag where
    new _ attrs = do
        o <- newZeroDebugCategory
        GI.Attributes.set o attrs
        return o


noDebugCategory :: Maybe DebugCategory
noDebugCategory = Nothing


#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
instance O.HasAttributeList DebugCategory
type instance O.AttributeList DebugCategory = DebugCategoryAttributeList
type DebugCategoryAttributeList = ('[ ] :: [(Symbol, *)])
#endif

-- method DebugCategory::free
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "category", argType = TInterface (Name {namespace = "Gst", name = "DebugCategory"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "#GstDebugCategory to free.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gst_debug_category_free" gst_debug_category_free :: 
    Ptr DebugCategory ->                    -- category : TInterface (Name {namespace = "Gst", name = "DebugCategory"})
    IO ()

{- |
Removes and frees the category and all associated resources.
-}
debugCategoryFree ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    DebugCategory
    {- ^ /@category@/: 'GI.Gst.Structs.DebugCategory.DebugCategory' to free. -}
    -> m ()
debugCategoryFree category = liftIO $ do
    category' <- unsafeManagedPtrGetPtr category
    gst_debug_category_free category'
    touchManagedPtr category
    return ()

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data DebugCategoryFreeMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo DebugCategoryFreeMethodInfo DebugCategory signature where
    overloadedMethod _ = debugCategoryFree

#endif

-- method DebugCategory::get_color
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "category", argType = TInterface (Name {namespace = "Gst", name = "DebugCategory"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDebugCategory to get the color of.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUInt)
-- throws : False
-- Skip return : False

foreign import ccall "gst_debug_category_get_color" gst_debug_category_get_color :: 
    Ptr DebugCategory ->                    -- category : TInterface (Name {namespace = "Gst", name = "DebugCategory"})
    IO Word32

{- |
Returns the color of a debug category used when printing output in this
category.
-}
debugCategoryGetColor ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    DebugCategory
    {- ^ /@category@/: a 'GI.Gst.Structs.DebugCategory.DebugCategory' to get the color of. -}
    -> m Word32
    {- ^ __Returns:__ the color of the category. -}
debugCategoryGetColor category = liftIO $ do
    category' <- unsafeManagedPtrGetPtr category
    result <- gst_debug_category_get_color category'
    touchManagedPtr category
    return result

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data DebugCategoryGetColorMethodInfo
instance (signature ~ (m Word32), MonadIO m) => O.MethodInfo DebugCategoryGetColorMethodInfo DebugCategory signature where
    overloadedMethod _ = debugCategoryGetColor

#endif

-- method DebugCategory::get_description
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "category", argType = TInterface (Name {namespace = "Gst", name = "DebugCategory"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDebugCategory to get the description of.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "gst_debug_category_get_description" gst_debug_category_get_description :: 
    Ptr DebugCategory ->                    -- category : TInterface (Name {namespace = "Gst", name = "DebugCategory"})
    IO CString

{- |
Returns the description of a debug category.
-}
debugCategoryGetDescription ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    DebugCategory
    {- ^ /@category@/: a 'GI.Gst.Structs.DebugCategory.DebugCategory' to get the description of. -}
    -> m T.Text
    {- ^ __Returns:__ the description of the category. -}
debugCategoryGetDescription category = liftIO $ do
    category' <- unsafeManagedPtrGetPtr category
    result <- gst_debug_category_get_description category'
    checkUnexpectedReturnNULL "debugCategoryGetDescription" result
    result' <- cstringToText result
    touchManagedPtr category
    return result'

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data DebugCategoryGetDescriptionMethodInfo
instance (signature ~ (m T.Text), MonadIO m) => O.MethodInfo DebugCategoryGetDescriptionMethodInfo DebugCategory signature where
    overloadedMethod _ = debugCategoryGetDescription

#endif

-- method DebugCategory::get_name
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "category", argType = TInterface (Name {namespace = "Gst", name = "DebugCategory"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDebugCategory to get name of.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "gst_debug_category_get_name" gst_debug_category_get_name :: 
    Ptr DebugCategory ->                    -- category : TInterface (Name {namespace = "Gst", name = "DebugCategory"})
    IO CString

{- |
Returns the name of a debug category.
-}
debugCategoryGetName ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    DebugCategory
    {- ^ /@category@/: a 'GI.Gst.Structs.DebugCategory.DebugCategory' to get name of. -}
    -> m T.Text
    {- ^ __Returns:__ the name of the category. -}
debugCategoryGetName category = liftIO $ do
    category' <- unsafeManagedPtrGetPtr category
    result <- gst_debug_category_get_name category'
    checkUnexpectedReturnNULL "debugCategoryGetName" result
    result' <- cstringToText result
    touchManagedPtr category
    return result'

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data DebugCategoryGetNameMethodInfo
instance (signature ~ (m T.Text), MonadIO m) => O.MethodInfo DebugCategoryGetNameMethodInfo DebugCategory signature where
    overloadedMethod _ = debugCategoryGetName

#endif

-- method DebugCategory::get_threshold
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "category", argType = TInterface (Name {namespace = "Gst", name = "DebugCategory"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDebugCategory to get threshold of.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gst", name = "DebugLevel"}))
-- throws : False
-- Skip return : False

foreign import ccall "gst_debug_category_get_threshold" gst_debug_category_get_threshold :: 
    Ptr DebugCategory ->                    -- category : TInterface (Name {namespace = "Gst", name = "DebugCategory"})
    IO CUInt

{- |
Returns the threshold of a 'GI.Gst.Structs.DebugCategory.DebugCategory'.
-}
debugCategoryGetThreshold ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    DebugCategory
    {- ^ /@category@/: a 'GI.Gst.Structs.DebugCategory.DebugCategory' to get threshold of. -}
    -> m Gst.Enums.DebugLevel
    {- ^ __Returns:__ the 'GI.Gst.Enums.DebugLevel' that is used as threshold. -}
debugCategoryGetThreshold category = liftIO $ do
    category' <- unsafeManagedPtrGetPtr category
    result <- gst_debug_category_get_threshold category'
    let result' = (toEnum . fromIntegral) result
    touchManagedPtr category
    return result'

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data DebugCategoryGetThresholdMethodInfo
instance (signature ~ (m Gst.Enums.DebugLevel), MonadIO m) => O.MethodInfo DebugCategoryGetThresholdMethodInfo DebugCategory signature where
    overloadedMethod _ = debugCategoryGetThreshold

#endif

-- method DebugCategory::reset_threshold
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "category", argType = TInterface (Name {namespace = "Gst", name = "DebugCategory"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDebugCategory to reset threshold of.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gst_debug_category_reset_threshold" gst_debug_category_reset_threshold :: 
    Ptr DebugCategory ->                    -- category : TInterface (Name {namespace = "Gst", name = "DebugCategory"})
    IO ()

{- |
Resets the threshold of the category to the default level. Debug information
will only be output if the threshold is lower or equal to the level of the
debugging message.
Use this function to set the threshold back to where it was after using
'GI.Gst.Structs.DebugCategory.debugCategorySetThreshold'.
-}
debugCategoryResetThreshold ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    DebugCategory
    {- ^ /@category@/: a 'GI.Gst.Structs.DebugCategory.DebugCategory' to reset threshold of. -}
    -> m ()
debugCategoryResetThreshold category = liftIO $ do
    category' <- unsafeManagedPtrGetPtr category
    gst_debug_category_reset_threshold category'
    touchManagedPtr category
    return ()

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data DebugCategoryResetThresholdMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo DebugCategoryResetThresholdMethodInfo DebugCategory signature where
    overloadedMethod _ = debugCategoryResetThreshold

#endif

-- method DebugCategory::set_threshold
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "category", argType = TInterface (Name {namespace = "Gst", name = "DebugCategory"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GstDebugCategory to set threshold of.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "level", argType = TInterface (Name {namespace = "Gst", name = "DebugLevel"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the #GstDebugLevel threshold to set.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gst_debug_category_set_threshold" gst_debug_category_set_threshold :: 
    Ptr DebugCategory ->                    -- category : TInterface (Name {namespace = "Gst", name = "DebugCategory"})
    CUInt ->                                -- level : TInterface (Name {namespace = "Gst", name = "DebugLevel"})
    IO ()

{- |
Sets the threshold of the category to the given level. Debug information will
only be output if the threshold is lower or equal to the level of the
debugging message.
> Do not use this function in production code, because other functions may
> change the threshold of categories as side effect. It is however a nice
> function to use when debugging (even from gdb).
-}
debugCategorySetThreshold ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    DebugCategory
    {- ^ /@category@/: a 'GI.Gst.Structs.DebugCategory.DebugCategory' to set threshold of. -}
    -> Gst.Enums.DebugLevel
    {- ^ /@level@/: the 'GI.Gst.Enums.DebugLevel' threshold to set. -}
    -> m ()
debugCategorySetThreshold category level = liftIO $ do
    category' <- unsafeManagedPtrGetPtr category
    let level' = (fromIntegral . fromEnum) level
    gst_debug_category_set_threshold category' level'
    touchManagedPtr category
    return ()

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data DebugCategorySetThresholdMethodInfo
instance (signature ~ (Gst.Enums.DebugLevel -> m ()), MonadIO m) => O.MethodInfo DebugCategorySetThresholdMethodInfo DebugCategory signature where
    overloadedMethod _ = debugCategorySetThreshold

#endif

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
type family ResolveDebugCategoryMethod (t :: Symbol) (o :: *) :: * where
    ResolveDebugCategoryMethod "free" o = DebugCategoryFreeMethodInfo
    ResolveDebugCategoryMethod "resetThreshold" o = DebugCategoryResetThresholdMethodInfo
    ResolveDebugCategoryMethod "getColor" o = DebugCategoryGetColorMethodInfo
    ResolveDebugCategoryMethod "getDescription" o = DebugCategoryGetDescriptionMethodInfo
    ResolveDebugCategoryMethod "getName" o = DebugCategoryGetNameMethodInfo
    ResolveDebugCategoryMethod "getThreshold" o = DebugCategoryGetThresholdMethodInfo
    ResolveDebugCategoryMethod "setThreshold" o = DebugCategorySetThresholdMethodInfo
    ResolveDebugCategoryMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveDebugCategoryMethod t DebugCategory, O.MethodInfo info DebugCategory p) => O.IsLabelProxy t (DebugCategory -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveDebugCategoryMethod t DebugCategory, O.MethodInfo info DebugCategory p) => O.IsLabel t (DebugCategory -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#else
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif
#endif

#endif