// Package config provides the configuration management interface.
// It defines the ConfigProvider interface that implementations must satisfy.
package config

import "time"

// ConfigProvider defines the interface for configuration management.
// It provides type-safe access to configuration values from various sources
// (YAML files, environment variables, etc.).
//
//nolint:revive // ConfigProvider is a standard interface name pattern; stuttering is acceptable
type ConfigProvider interface {
	// Get retrieves a configuration value by key.
	// Returns nil if the key is not found.
	Get(key string) any

	// Unmarshal unmarshals the entire configuration into the provided struct.
	// The struct should use appropriate tags for mapping configuration keys.
	Unmarshal(v any) error

	// GetString retrieves a string value by key.
	// Returns empty string if the key is not found.
	GetString(key string) string

	// GetInt retrieves an integer value by key.
	// Returns 0 if the key is not found or cannot be converted.
	GetInt(key string) int

	// GetBool retrieves a boolean value by key.
	// Returns false if the key is not found or cannot be converted.
	GetBool(key string) bool

	// GetStringSlice retrieves a string slice value by key.
	// Returns nil if the key is not found.
	GetStringSlice(key string) []string

	// GetDuration retrieves a duration value by key.
	// Returns 0 if the key is not found or cannot be parsed.
	GetDuration(key string) time.Duration

	// IsSet checks if a configuration key is set.
	IsSet(key string) bool
}
