package log

import (
	"math"
	"time"

	"github.com/go-kratos/kratos/pkg/log/internal/core"
)

// D represents a map of entry level data used for structured logging.
// type D map[string]interface{}
type D = core.Field

// KVString construct Field with string value.
func KVString(key string, value string) D {
	return D{Key: key, Type: core.StringType, StringVal: value}
}

// KVInt construct Field with int value.
func KVInt(key string, value int) D {
	return D{Key: key, Type: core.IntTpye, Int64Val: int64(value)}
}

// KVInt64 construct D with int64 value.
func KVInt64(key string, value int64) D {
	return D{Key: key, Type: core.Int64Type, Int64Val: value}
}

// KVUint construct Field with uint value.
func KVUint(key string, value uint) D {
	return D{Key: key, Type: core.UintType, Int64Val: int64(value)}
}

// KVUint64 construct Field with uint64 value.
func KVUint64(key string, value uint64) D {
	return D{Key: key, Type: core.Uint64Type, Int64Val: int64(value)}
}

// KVFloat32 construct Field with float32 value.
func KVFloat32(key string, value float32) D {
	return D{Key: key, Type: core.Float32Type, Int64Val: int64(math.Float32bits(value))}
}

// KVFloat64 construct Field with float64 value.
func KVFloat64(key string, value float64) D {
	return D{Key: key, Type: core.Float64Type, Int64Val: int64(math.Float64bits(value))}
}

// KVDuration construct Field with Duration value.
func KVDuration(key string, value time.Duration) D {
	return D{Key: key, Type: core.DurationType, Int64Val: int64(value)}
}

// KV return a log kv for logging field.
// NOTE: use KV{type name} can avoid object alloc and get better performance. []~(￣▽￣)~*干杯
func KV(key string, value interface{}) D {
	return D{Key: key, Value: value}
}
