package config

import (
	"github.com/spf13/viper"
)

// Config stores all configuration of the application.
type Config struct {
	Environment             string `mapstructure:"ENVIRONMENT"`
	ServerPort              string `mapstructure:"SERVER_PORT"`
	DBHost                  string `mapstructure:"DB_HOST"`
	DBPort                  string `mapstructure:"DB_PORT"`
	DBUser                  string `mapstructure:"DB_USER"`
	DBPassword              string `mapstructure:"DB_PASSWORD"`
	DBName                  string `mapstructure:"DB_NAME"`
	JWTSecret               string `mapstructure:"JWT_SECRET"`
	JWTExpiration           int    `mapstructure:"JWT_EXPIRATION_HOURS"`
	WeaviateHost            string `mapstructure:"WEAVIATE_HOST"`
	WeaviateScheme          string `mapstructure:"WEAVIATE_SCHEME"`
	MigrationPath           string `mapstructure:"MIGRATION_PATH"`
	RedisAddr               string `mapstructure:"REDIS_ADDR"`
	RedisPassword           string `mapstructure:"REDIS_PASSWORD"`
	RedisDB                 int    `mapstructure:"REDIS_DB"`
	BatchSize               int    `mapstructure:"BATCH_SIZE"`
	RateLimit               int    `mapstructure:"RATE_LIMIT"`
	RateLimitBurst          int    `mapstructure:"RATE_LIMIT_BURST"`
	PageSize                int    `mapstructure:"PAGE_SIZE"`
	NLPMemoryCacheCap       int    `mapstructure:"NLP_MEMORY_CACHE_CAP"`
	NLPRedisCacheTTLSeconds int    `mapstructure:"NLP_REDIS_CACHE_TTL_SECONDS"`
	NLPUseLingua            bool   `mapstructure:"NLP_USE_LINGUA"`
	NLPUseTFIDF             bool   `mapstructure:"NLP_USE_TFIDF"`
	BleveIndexPath          string `mapstructure:"BLEVE_INDEX_PATH"`
}

// Global config instance
var Cfg *Config

// LoadConfig reads configuration from file or environment variables.
func LoadConfig() (*Config, error) {
	v := viper.New()

	v.SetDefault("ENVIRONMENT", "development")
	v.SetDefault("SERVER_PORT", ":8080")
	v.SetDefault("DB_HOST", "localhost")
	v.SetDefault("DB_PORT", "5432")
	v.SetDefault("DB_USER", "user")
	v.SetDefault("DB_PASSWORD", "password")
	v.SetDefault("DB_NAME", "tercul")
	v.SetDefault("JWT_SECRET", "secret")
	v.SetDefault("JWT_EXPIRATION_HOURS", 24)
	v.SetDefault("WEAVIATE_HOST", "localhost:8080")
	v.SetDefault("WEAVIATE_SCHEME", "http")
	v.SetDefault("MIGRATION_PATH", "internal/data/migrations")
	v.SetDefault("REDIS_ADDR", "localhost:6379")
	v.SetDefault("REDIS_PASSWORD", "")
	v.SetDefault("REDIS_DB", 0)
	v.SetDefault("BATCH_SIZE", 100)
	v.SetDefault("RATE_LIMIT", 10)
	v.SetDefault("RATE_LIMIT_BURST", 100)
	v.SetDefault("NLP_MEMORY_CACHE_CAP", 1024)
	v.SetDefault("NLP_REDIS_CACHE_TTL_SECONDS", 3600)
	v.SetDefault("NLP_USE_LINGUA", true)
	v.SetDefault("NLP_USE_TFIDF", true)
	v.SetDefault("BLEVE_INDEX_PATH", "./bleve_index")

	v.AutomaticEnv()

	var config Config
	if err := v.Unmarshal(&config); err != nil {
		return nil, err
	}

	// Set global config
	Cfg = &config

	return &config, nil
}
