module Database.DuckDB.FFI.ValueInterface (
    c_duckdb_destroy_value,
    c_duckdb_create_varchar,
    c_duckdb_create_varchar_length,
    c_duckdb_create_bool,
    c_duckdb_create_int8,
    c_duckdb_create_uint8,
    c_duckdb_create_int16,
    c_duckdb_create_uint16,
    c_duckdb_create_int32,
    c_duckdb_create_uint32,
    c_duckdb_create_uint64,
    c_duckdb_create_int64,
    c_duckdb_create_hugeint,
    c_duckdb_create_uhugeint,
    c_duckdb_create_bignum,
    c_duckdb_create_decimal,
    c_duckdb_create_float,
    c_duckdb_create_double,
    c_duckdb_create_date,
    c_duckdb_create_time,
    c_duckdb_create_time_ns,
    c_duckdb_create_time_tz_value,
    c_duckdb_create_timestamp,
    c_duckdb_create_timestamp_tz,
    c_duckdb_create_timestamp_s,
    c_duckdb_create_timestamp_ms,
    c_duckdb_create_timestamp_ns,
    c_duckdb_create_interval,
    c_duckdb_create_blob,
    c_duckdb_create_bit,
    c_duckdb_create_uuid,
    c_duckdb_get_bool,
    c_duckdb_get_int8,
    c_duckdb_get_uint8,
    c_duckdb_get_int16,
    c_duckdb_get_uint16,
    c_duckdb_get_int32,
    c_duckdb_get_uint32,
    c_duckdb_get_int64,
    c_duckdb_get_uint64,
    c_duckdb_get_hugeint,
    c_duckdb_get_uhugeint,
    c_duckdb_get_bignum,
    c_duckdb_get_decimal,
    c_duckdb_get_float,
    c_duckdb_get_double,
    c_duckdb_get_date,
    c_duckdb_get_time,
    c_duckdb_get_time_ns,
    c_duckdb_get_time_tz,
    c_duckdb_get_timestamp,
    c_duckdb_get_timestamp_tz,
    c_duckdb_get_timestamp_s,
    c_duckdb_get_timestamp_ms,
    c_duckdb_get_timestamp_ns,
    c_duckdb_get_interval,
    c_duckdb_get_value_type,
    c_duckdb_get_blob,
    c_duckdb_get_bit,
    c_duckdb_get_uuid,
    c_duckdb_get_varchar,
    c_duckdb_create_struct_value,
    c_duckdb_create_list_value,
    c_duckdb_create_array_value,
    c_duckdb_create_map_value,
    c_duckdb_create_union_value,
    c_duckdb_get_map_size,
    c_duckdb_get_map_key,
    c_duckdb_get_map_value,
    c_duckdb_is_null_value,
    c_duckdb_create_null_value,
    c_duckdb_get_list_size,
    c_duckdb_get_list_child,
    c_duckdb_create_enum_value,
    c_duckdb_get_enum_value,
    c_duckdb_get_struct_child,
    c_duckdb_value_to_string,
) where

import Data.Int (Int16, Int32, Int64, Int8)
import Data.Word (Word16, Word32, Word64, Word8)
import Database.DuckDB.FFI.Types
import Foreign.C.String (CString)
import Foreign.C.Types (CBool (..), CDouble (..), CFloat (..))
import Foreign.Ptr (Ptr)

{- | Destroys the value and de-allocates all memory allocated for that type.

Parameters:
* @value@: The value to destroy.
-}
foreign import ccall safe "duckdb_destroy_value"
    c_duckdb_destroy_value :: Ptr DuckDBValue -> IO ()

{- | Creates a value from a null-terminated string

Parameters:
* @text@: The null-terminated string

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_varchar"
    c_duckdb_create_varchar :: CString -> IO DuckDBValue

{- | Creates a value from a string

Parameters:
* @text@: The text
* @length@: The length of the text

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_varchar_length"
    c_duckdb_create_varchar_length :: CString -> DuckDBIdx -> IO DuckDBValue

{- | Creates a value from a boolean

Parameters:
* @input@: The boolean value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_bool"
    c_duckdb_create_bool :: CBool -> IO DuckDBValue

{- | Creates a value from an int8_t (a tinyint)

Parameters:
* @input@: The tinyint value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_int8"
    c_duckdb_create_int8 :: Int8 -> IO DuckDBValue

{- | Creates a value from a uint8_t (a utinyint)

Parameters:
* @input@: The utinyint value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_uint8"
    c_duckdb_create_uint8 :: Word8 -> IO DuckDBValue

{- | Creates a value from an int16_t (a smallint)

Parameters:
* @input@: The smallint value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_int16"
    c_duckdb_create_int16 :: Int16 -> IO DuckDBValue

{- | Creates a value from a uint16_t (a usmallint)

Parameters:
* @input@: The usmallint value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_uint16"
    c_duckdb_create_uint16 :: Word16 -> IO DuckDBValue

{- | Creates a value from an int32_t (an integer)

Parameters:
* @input@: The integer value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_int32"
    c_duckdb_create_int32 :: Int32 -> IO DuckDBValue

{- | Creates a value from a uint32_t (a uinteger)

Parameters:
* @input@: The uinteger value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_uint32"
    c_duckdb_create_uint32 :: Word32 -> IO DuckDBValue

{- | Creates a value from a uint64_t (a ubigint)

Parameters:
* @input@: The ubigint value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_uint64"
    c_duckdb_create_uint64 :: Word64 -> IO DuckDBValue

{- | Creates a value from an int64

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_int64"
    c_duckdb_create_int64 :: Int64 -> IO DuckDBValue

{- | Creates a value from a hugeint

Parameters:
* @input@: The hugeint value

Returns The value. This must be destroyed with @duckdb_destroy_value@.

These bindings call the wrapper symbol @wrapped_duckdb_create_hugeint@
but mirror the DuckDB C API semantics of @duckdb_create_hugeint@.
-}
foreign import ccall safe "wrapped_duckdb_create_hugeint"
    c_duckdb_create_hugeint :: Ptr DuckDBHugeInt -> IO DuckDBValue

{- | Creates a value from a uhugeint

Parameters:
* @input@: The uhugeint value

Returns The value. This must be destroyed with @duckdb_destroy_value@.

These bindings call the wrapper symbol @wrapped_duckdb_create_uhugeint@
but mirror the DuckDB C API semantics of @duckdb_create_uhugeint@.
-}
foreign import ccall safe "wrapped_duckdb_create_uhugeint"
    c_duckdb_create_uhugeint :: Ptr DuckDBUHugeInt -> IO DuckDBValue

{- | Creates a BIGNUM value from a duckdb_bignum

Parameters:
* @input@: The duckdb_bignum value

Returns The value. This must be destroyed with @duckdb_destroy_value@.

These bindings call the wrapper symbol @wrapped_duckdb_create_bignum@
but mirror the DuckDB C API semantics of @duckdb_create_bignum@.
-}
foreign import ccall safe "wrapped_duckdb_create_bignum"
    c_duckdb_create_bignum :: Ptr DuckDBBignum -> IO DuckDBValue

{- | Creates a DECIMAL value from a duckdb_decimal

Parameters:
* @input@: The duckdb_decimal value

Returns The value. This must be destroyed with @duckdb_destroy_value@.

These bindings call the wrapper symbol @wrapped_duckdb_create_decimal@
but mirror the DuckDB C API semantics of @duckdb_create_decimal@.
-}
foreign import ccall safe "wrapped_duckdb_create_decimal"
    c_duckdb_create_decimal :: Ptr DuckDBDecimal -> IO DuckDBValue

{- | Creates a value from a float

Parameters:
* @input@: The float value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_float"
    c_duckdb_create_float :: CFloat -> IO DuckDBValue

{- | Creates a value from a double

Parameters:
* @input@: The double value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_double"
    c_duckdb_create_double :: CDouble -> IO DuckDBValue

{- | Creates a value from a date

Parameters:
* @input@: The date value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_date"
    c_duckdb_create_date :: DuckDBDate -> IO DuckDBValue

{- | Creates a value from a time

Parameters:
* @input@: The time value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_time"
    c_duckdb_create_time :: DuckDBTime -> IO DuckDBValue

{- | Creates a value from a time_ns

Parameters:
* @input@: The time value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_time_ns"
    c_duckdb_create_time_ns :: DuckDBTimeNs -> IO DuckDBValue

{- | Creates a value from a time_tz. Not to be confused with
@duckdb_create_time_tz@, which creates a duckdb_time_tz_t.

Parameters:
* @value@: The time_tz value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_time_tz_value"
    c_duckdb_create_time_tz_value :: DuckDBTimeTz -> IO DuckDBValue

{- | Creates a TIMESTAMP value from a duckdb_timestamp

Parameters:
* @input@: The duckdb_timestamp value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_timestamp"
    c_duckdb_create_timestamp :: DuckDBTimestamp -> IO DuckDBValue

{- | Creates a TIMESTAMP_TZ value from a duckdb_timestamp

Parameters:
* @input@: The duckdb_timestamp value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_timestamp_tz"
    c_duckdb_create_timestamp_tz :: DuckDBTimestamp -> IO DuckDBValue

{- | Creates a TIMESTAMP_S value from a duckdb_timestamp_s

Parameters:
* @input@: The duckdb_timestamp_s value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_timestamp_s"
    c_duckdb_create_timestamp_s :: DuckDBTimestampS -> IO DuckDBValue

{- | Creates a TIMESTAMP_MS value from a duckdb_timestamp_ms

Parameters:
* @input@: The duckdb_timestamp_ms value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_timestamp_ms"
    c_duckdb_create_timestamp_ms :: DuckDBTimestampMs -> IO DuckDBValue

{- | Creates a TIMESTAMP_NS value from a duckdb_timestamp_ns

Parameters:
* @input@: The duckdb_timestamp_ns value

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_timestamp_ns"
    c_duckdb_create_timestamp_ns :: DuckDBTimestampNs -> IO DuckDBValue

{- | Creates a value from an interval

Parameters:
* @input@: The interval value

Returns The value. This must be destroyed with @duckdb_destroy_value@.

These bindings call the wrapper symbol @wrapped_duckdb_create_interval@
but mirror the DuckDB C API semantics of @duckdb_create_interval@.
-}
foreign import ccall safe "wrapped_duckdb_create_interval"
    c_duckdb_create_interval :: Ptr DuckDBInterval -> IO DuckDBValue

{- | Creates a value from a blob

Parameters:
* @data@: The blob data
* @length@: The length of the blob data

Returns The value. This must be destroyed with @duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_blob"
    c_duckdb_create_blob :: Ptr Word8 -> DuckDBIdx -> IO DuckDBValue

{- | Creates a BIT value from a duckdb_bit

Parameters:
* @input@: The duckdb_bit value

Returns The value. This must be destroyed with @duckdb_destroy_value@.

These bindings call the wrapper symbol @wrapped_duckdb_create_bit@ but
mirror the DuckDB C API semantics of @duckdb_create_bit@.
-}
foreign import ccall safe "wrapped_duckdb_create_bit"
    c_duckdb_create_bit :: Ptr DuckDBBit -> IO DuckDBValue

{- | Creates a UUID value from a uhugeint

Parameters:
* @input@: The duckdb_uhugeint containing the UUID

Returns The value. This must be destroyed with @duckdb_destroy_value@.

These bindings call the wrapper symbol @wrapped_duckdb_create_uuid@ but
mirror the DuckDB C API semantics of @duckdb_create_uuid@.
-}
foreign import ccall safe "wrapped_duckdb_create_uuid"
    c_duckdb_create_uuid :: Ptr DuckDBUHugeInt -> IO DuckDBValue

{- | Returns the boolean value of the given value.

Parameters:
* @val@: A duckdb_value containing a boolean

Returns A boolean, or false if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_bool"
    c_duckdb_get_bool :: DuckDBValue -> IO CBool

{- | Returns the int8_t value of the given value.

Parameters:
* @val@: A duckdb_value containing a tinyint

Returns A int8_t, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_int8"
    c_duckdb_get_int8 :: DuckDBValue -> IO Int8

{- | Returns the uint8_t value of the given value.

Parameters:
* @val@: A duckdb_value containing a utinyint

Returns A uint8_t, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_uint8"
    c_duckdb_get_uint8 :: DuckDBValue -> IO Word8

{- | Returns the int16_t value of the given value.

Parameters:
* @val@: A duckdb_value containing a smallint

Returns A int16_t, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_int16"
    c_duckdb_get_int16 :: DuckDBValue -> IO Int16

{- | Returns the uint16_t value of the given value.

Parameters:
* @val@: A duckdb_value containing a usmallint

Returns A uint16_t, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_uint16"
    c_duckdb_get_uint16 :: DuckDBValue -> IO Word16

{- | Returns the int32_t value of the given value.

Parameters:
* @val@: A duckdb_value containing an integer

Returns A int32_t, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_int32"
    c_duckdb_get_int32 :: DuckDBValue -> IO Int32

{- | Returns the uint32_t value of the given value.

Parameters:
* @val@: A duckdb_value containing a uinteger

Returns A uint32_t, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_uint32"
    c_duckdb_get_uint32 :: DuckDBValue -> IO Word32

{- | Returns the int64_t value of the given value.

Parameters:
* @val@: A duckdb_value containing a bigint

Returns A int64_t, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_int64"
    c_duckdb_get_int64 :: DuckDBValue -> IO Int64

{- | Returns the uint64_t value of the given value.

Parameters:
* @val@: A duckdb_value containing a ubigint

Returns A uint64_t, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_uint64"
    c_duckdb_get_uint64 :: DuckDBValue -> IO Word64

{- | Returns the hugeint value of the given value.

Parameters:
* @val@: A duckdb_value containing a hugeint

Returns A duckdb_hugeint, or MinValue if the value cannot be converted

These bindings call the wrapper symbol @wrapped_duckdb_get_hugeint@ but
mirror the DuckDB C API semantics of @duckdb_get_hugeint@.
-}
foreign import ccall safe "wrapped_duckdb_get_hugeint"
    c_duckdb_get_hugeint :: DuckDBValue -> Ptr DuckDBHugeInt -> IO ()

{- | Returns the uhugeint value of the given value.

Parameters:
* @val@: A duckdb_value containing a uhugeint

Returns A duckdb_uhugeint, or MinValue if the value cannot be converted

These bindings call the wrapper symbol @wrapped_duckdb_get_uhugeint@
but mirror the DuckDB C API semantics of @duckdb_get_uhugeint@.
-}
foreign import ccall safe "wrapped_duckdb_get_uhugeint"
    c_duckdb_get_uhugeint :: DuckDBValue -> Ptr DuckDBUHugeInt -> IO ()

{- | Returns the duckdb_bignum value of the given value. The @data@ field must be
destroyed with @duckdb_free@.

Parameters:
* @val@: A duckdb_value containing a BIGNUM

Returns A duckdb_bignum. The @data@ field must be destroyed with
@duckdb_free@.

These bindings call the wrapper symbol @wrapped_duckdb_get_bignum@ but
mirror the DuckDB C API semantics of @duckdb_get_bignum@.
-}
foreign import ccall safe "wrapped_duckdb_get_bignum"
    c_duckdb_get_bignum :: DuckDBValue -> Ptr DuckDBBignum -> IO ()

{- | Returns the duckdb_decimal value of the given value.

Parameters:
* @val@: A duckdb_value containing a DECIMAL

Returns A duckdb_decimal, or MinValue if the value cannot be converted

These bindings call the wrapper symbol @wrapped_duckdb_get_decimal@ but
mirror the DuckDB C API semantics of @duckdb_get_decimal@.
-}
foreign import ccall safe "wrapped_duckdb_get_decimal"
    c_duckdb_get_decimal :: DuckDBValue -> Ptr DuckDBDecimal -> IO ()

{- | Returns the float value of the given value.

Parameters:
* @val@: A duckdb_value containing a float

Returns A float, or NAN if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_float"
    c_duckdb_get_float :: DuckDBValue -> IO CFloat

{- | Returns the double value of the given value.

Parameters:
* @val@: A duckdb_value containing a double

Returns A double, or NAN if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_double"
    c_duckdb_get_double :: DuckDBValue -> IO CDouble

{- | Returns the date value of the given value.

Parameters:
* @val@: A duckdb_value containing a date

Returns A duckdb_date, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_date"
    c_duckdb_get_date :: DuckDBValue -> IO DuckDBDate

{- | Returns the time value of the given value.

Parameters:
* @val@: A duckdb_value containing a time

Returns A duckdb_time, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_time"
    c_duckdb_get_time :: DuckDBValue -> IO DuckDBTime

{- | Returns the time_ns value of the given value.

Parameters:
* @val@: A duckdb_value containing a time_ns

Returns A duckdb_time_ns, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_time_ns"
    c_duckdb_get_time_ns :: DuckDBValue -> IO DuckDBTimeNs

{- | Returns the time_tz value of the given value.

Parameters:
* @val@: A duckdb_value containing a time_tz

Returns A duckdb_time_tz, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_time_tz"
    c_duckdb_get_time_tz :: DuckDBValue -> IO DuckDBTimeTz

{- | Returns the TIMESTAMP value of the given value.

Parameters:
* @val@: A duckdb_value containing a TIMESTAMP

Returns A duckdb_timestamp, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_timestamp"
    c_duckdb_get_timestamp :: DuckDBValue -> IO DuckDBTimestamp

{- | Returns the TIMESTAMP_TZ value of the given value.

Parameters:
* @val@: A duckdb_value containing a TIMESTAMP_TZ

Returns A duckdb_timestamp, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_timestamp_tz"
    c_duckdb_get_timestamp_tz :: DuckDBValue -> IO DuckDBTimestamp

{- | Returns the duckdb_timestamp_s value of the given value.

Parameters:
* @val@: A duckdb_value containing a TIMESTAMP_S

Returns A duckdb_timestamp_s, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_timestamp_s"
    c_duckdb_get_timestamp_s :: DuckDBValue -> IO DuckDBTimestampS

{- | Returns the duckdb_timestamp_ms value of the given value.

Parameters:
* @val@: A duckdb_value containing a TIMESTAMP_MS

Returns A duckdb_timestamp_ms, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_timestamp_ms"
    c_duckdb_get_timestamp_ms :: DuckDBValue -> IO DuckDBTimestampMs

{- | Returns the duckdb_timestamp_ns value of the given value.

Parameters:
* @val@: A duckdb_value containing a TIMESTAMP_NS

Returns A duckdb_timestamp_ns, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_timestamp_ns"
    c_duckdb_get_timestamp_ns :: DuckDBValue -> IO DuckDBTimestampNs

{- | Returns the interval value of the given value.

Parameters:
* @val@: A duckdb_value containing a interval

Returns A duckdb_interval, or MinValue if the value cannot be converted

These bindings call the wrapper symbol @wrapped_duckdb_get_interval@
but mirror the DuckDB C API semantics of @duckdb_get_interval@.
-}
foreign import ccall safe "wrapped_duckdb_get_interval"
    c_duckdb_get_interval :: DuckDBValue -> Ptr DuckDBInterval -> IO ()

{- | Returns the type of the given value. The type is valid as long as the value is
not destroyed. The type itself must not be destroyed.

Parameters:
* @val@: A duckdb_value

Returns A duckdb_logical_type.
-}
foreign import ccall safe "duckdb_get_value_type"
    c_duckdb_get_value_type :: DuckDBValue -> IO DuckDBLogicalType

{- | Returns the blob value of the given value.

Parameters:
* @val@: A duckdb_value containing a blob

Returns A duckdb_blob

These bindings call the wrapper symbol @wrapped_duckdb_get_blob@ but
mirror the DuckDB C API semantics of @duckdb_get_blob@.
-}
foreign import ccall safe "wrapped_duckdb_get_blob"
    c_duckdb_get_blob :: DuckDBValue -> Ptr DuckDBBlob -> IO ()

{- | Returns the duckdb_bit value of the given value. The @data@ field must be
destroyed with @duckdb_free@.

Parameters:
* @val@: A duckdb_value containing a BIT

Returns A duckdb_bit

These bindings call the wrapper symbol @wrapped_duckdb_get_bit@ but
mirror the DuckDB C API semantics of @duckdb_get_bit@.
-}
foreign import ccall safe "wrapped_duckdb_get_bit"
    c_duckdb_get_bit :: DuckDBValue -> Ptr DuckDBBit -> IO ()

{- | Returns a duckdb_uhugeint representing the UUID value of the given value.

Parameters:
* @val@: A duckdb_value containing a UUID

Returns A duckdb_uhugeint representing the UUID value

These bindings call the wrapper symbol @wrapped_duckdb_get_uuid@ but
mirror the DuckDB C API semantics of @duckdb_get_uuid@.
-}
foreign import ccall safe "wrapped_duckdb_get_uuid"
    c_duckdb_get_uuid :: DuckDBValue -> Ptr DuckDBUHugeInt -> IO ()

{- | Obtains a string representation of the given value. The result must be
destroyed with @duckdb_free@.

Parameters:
* @value@: The value

Returns The string value. This must be destroyed with @duckdb_free@.
-}
foreign import ccall safe "duckdb_get_varchar"
    c_duckdb_get_varchar :: DuckDBValue -> IO CString

{- | Creates a struct value from a type and an array of values. Must be destroyed
with @duckdb_destroy_value@.

Parameters:
* @type@: The type of the struct
* @values@: The values for the struct fields

Returns The struct value, or nullptr, if any child type is @DUCKDB_TYPE_ANY@
or @DUCKDB_TYPE_INVALID@.
-}
foreign import ccall safe "duckdb_create_struct_value"
    c_duckdb_create_struct_value :: DuckDBLogicalType -> Ptr DuckDBValue -> IO DuckDBValue

{- | Creates a list value from a child (element) type and an array of values of
length @value_count@. Must be destroyed with @duckdb_destroy_value@.

Parameters:
* @type@: The type of the list
* @values@: The values for the list
* @value_count@: The number of values in the list

Returns The list value, or nullptr, if the child type is @DUCKDB_TYPE_ANY@ or
@DUCKDB_TYPE_INVALID@.
-}
foreign import ccall safe "duckdb_create_list_value"
    c_duckdb_create_list_value :: DuckDBLogicalType -> Ptr DuckDBValue -> DuckDBIdx -> IO DuckDBValue

{- | Creates an array value from a child (element) type and an array of values of
length @value_count@. Must be destroyed with @duckdb_destroy_value@.

Parameters:
* @type@: The type of the array
* @values@: The values for the array
* @value_count@: The number of values in the array

Returns The array value, or nullptr, if the child type is @DUCKDB_TYPE_ANY@ or
@DUCKDB_TYPE_INVALID@.
-}
foreign import ccall safe "duckdb_create_array_value"
    c_duckdb_create_array_value :: DuckDBLogicalType -> Ptr DuckDBValue -> DuckDBIdx -> IO DuckDBValue

{- | Creates a map value from a map type and two arrays, one for the keys and one
for the values, each of length @entry_count@. Must be destroyed with
@duckdb_destroy_value@.

Parameters:
* @map_type@: The map type
* @keys@: The keys of the map
* @values@: The values of the map
* @entry_count@: The number of entrys (key-value pairs) in the map

Returns The map value, or nullptr, if the parameters are invalid.
-}
foreign import ccall safe "duckdb_create_map_value"
    c_duckdb_create_map_value :: DuckDBLogicalType -> Ptr DuckDBValue -> Ptr DuckDBValue -> DuckDBIdx -> IO DuckDBValue

{- | Creates a union value from a union type, a tag index, and a value. Must be
destroyed with @duckdb_destroy_value@.

Parameters:
* @union_type@: The union type
* @tag_index@: The index of the tag of the union
* @value@: The value of the union for that tag

Returns The union value, or nullptr, if the parameters are invalid.
-}
foreign import ccall safe "duckdb_create_union_value"
    c_duckdb_create_union_value :: DuckDBLogicalType -> DuckDBIdx -> DuckDBValue -> IO DuckDBValue

{- | Returns the number of elements in a MAP value.

Parameters:
* @value@: The MAP value.

Returns The number of elements in the map.
-}
foreign import ccall safe "duckdb_get_map_size"
    c_duckdb_get_map_size :: DuckDBValue -> IO DuckDBIdx

{- | Returns the MAP key at index as a duckdb_value.

Parameters:
* @value@: The MAP value.
* @index@: The index of the key.

Returns The key as a duckdb_value.
-}
foreign import ccall safe "duckdb_get_map_key"
    c_duckdb_get_map_key :: DuckDBValue -> DuckDBIdx -> IO DuckDBValue

{- | Returns the MAP value at index as a duckdb_value.

Parameters:
* @value@: The MAP value.
* @index@: The index of the value.

Returns The value as a duckdb_value.
-}
foreign import ccall safe "duckdb_get_map_value"
    c_duckdb_get_map_value :: DuckDBValue -> DuckDBIdx -> IO DuckDBValue

{- | Returns whether the value's type is SQLNULL or not.

Parameters:
* @value@: The value to check.

Returns True, if the value's type is SQLNULL, otherwise false.
-}
foreign import ccall safe "duckdb_is_null_value"
    c_duckdb_is_null_value :: DuckDBValue -> IO CBool

{- | Creates a value of type SQLNULL.

Returns The duckdb_value representing SQLNULL. This must be destroyed with
@duckdb_destroy_value@.
-}
foreign import ccall safe "duckdb_create_null_value"
    c_duckdb_create_null_value :: IO DuckDBValue

{- | Returns the number of elements in a LIST value.

Parameters:
* @value@: The LIST value.

Returns The number of elements in the list.
-}
foreign import ccall safe "duckdb_get_list_size"
    c_duckdb_get_list_size :: DuckDBValue -> IO DuckDBIdx

{- | Returns the LIST child at index as a duckdb_value.

Parameters:
* @value@: The LIST value.
* @index@: The index of the child.

Returns The child as a duckdb_value.
-}
foreign import ccall safe "duckdb_get_list_child"
    c_duckdb_get_list_child :: DuckDBValue -> DuckDBIdx -> IO DuckDBValue

{- | Creates an enum value from a type and a value. Must be destroyed with
@duckdb_destroy_value@.

Parameters:
* @type@: The type of the enum
* @value@: The value for the enum

Returns The enum value, or nullptr.
-}
foreign import ccall safe "duckdb_create_enum_value"
    c_duckdb_create_enum_value :: DuckDBLogicalType -> Word64 -> IO DuckDBValue

{- | Returns the enum value of the given value.

Parameters:
* @value@: A duckdb_value containing an enum

Returns A uint64_t, or MinValue if the value cannot be converted
-}
foreign import ccall safe "duckdb_get_enum_value"
    c_duckdb_get_enum_value :: DuckDBValue -> IO Word64

{- | Returns the STRUCT child at index as a duckdb_value.

Parameters:
* @value@: The STRUCT value.
* @index@: The index of the child.

Returns The child as a duckdb_value.
-}
foreign import ccall safe "duckdb_get_struct_child"
    c_duckdb_get_struct_child :: DuckDBValue -> DuckDBIdx -> IO DuckDBValue

{- | Returns the SQL string representation of the given value.

Parameters:
* @value@: A duckdb_value.

Returns The SQL string representation as a null-terminated string. The result
must be freed with @duckdb_free@.
-}
foreign import ccall safe "duckdb_value_to_string"
    c_duckdb_value_to_string :: DuckDBValue -> IO CString