// Package config handles configuration loading for the API Gateway
package config

import (
	"os"
)

// Config holds the application configuration
type Config struct {
	Environment string
	Port        string
	Version     string

	// Database
	DatabaseURL string

	// Redis
	RedisURL string

	// JWT
	JWTSecret     string
	JWTExpiration int // hours

	// Rate limiting
	RateLimit RateLimitConfig

	// Services
	ComplianceEngineURL string
	RAGServiceURL       string
	SecurityScannerURL  string

	// Storage
	MinIOEndpoint  string
	MinIOAccessKey string
	MinIOSecretKey string
	MinIOBucket    string
}

// RateLimitConfig holds rate limiting configuration
type RateLimitConfig struct {
	RequestsPerSecond int
	Burst             int
}

// Load loads configuration from environment variables
func Load() (*Config, error) {
	cfg := &Config{
		Environment: getEnv("ENVIRONMENT", "development"),
		Port:        getEnv("PORT", "8080"),
		Version:     getEnv("VERSION", "0.0.1"),

		DatabaseURL: getEnv("DATABASE_URL", "postgres://breakpilot:breakpilot@localhost:5432/compliance"),
		RedisURL:    getEnv("REDIS_URL", "redis://localhost:6379"),

		JWTSecret:     getEnv("JWT_SECRET", "your-secret-key-change-in-production"),
		JWTExpiration: getEnvInt("JWT_EXPIRATION", 24),

		RateLimit: RateLimitConfig{
			RequestsPerSecond: getEnvInt("RATE_LIMIT_RPS", 100),
			Burst:             getEnvInt("RATE_LIMIT_BURST", 200),
		},

		ComplianceEngineURL: getEnv("COMPLIANCE_ENGINE_URL", "http://compliance-engine:8081"),
		RAGServiceURL:       getEnv("RAG_SERVICE_URL", "http://rag-service:8082"),
		SecurityScannerURL:  getEnv("SECURITY_SCANNER_URL", "http://security-scanner:8083"),

		MinIOEndpoint:  getEnv("MINIO_ENDPOINT", "minio:9000"),
		MinIOAccessKey: getEnv("MINIO_ACCESS_KEY", "breakpilot"),
		MinIOSecretKey: getEnv("MINIO_SECRET_KEY", "breakpilot123"),
		MinIOBucket:    getEnv("MINIO_BUCKET", "compliance"),
	}

	return cfg, nil
}

func getEnv(key, defaultValue string) string {
	if value := os.Getenv(key); value != "" {
		return value
	}
	return defaultValue
}

func getEnvInt(key string, defaultValue int) int {
	if value := os.Getenv(key); value != "" {
		// Simple conversion, production code should handle errors
		var result int
		for _, c := range value {
			result = result*10 + int(c-'0')
		}
		return result
	}
	return defaultValue
}
