package config

import (
	"log"
	"os"
	"strconv"

	"github.com/joho/godotenv"
)

type Config struct {
	AppPort                 string
	DatabaseURL             string
	JWTSecret               string
	FirebaseBucket          string
	FirebaseCredentialsPath string
	RedisHost               string
	RedisPort               string
	RedisPassword           string
	RedisDB                 int
	QueueWorkerCount        int
	RateLimitEnabled        bool
	LogAsync                bool

	// Midtrans
	MidtransServerKey    string
	MidtransClientKey    string
	MidtransIsProduction bool

	// SMTP
	SMTPHost     string
	SMTPPort     string
	SMTPUsername string
	SMTPPassword string
	SMTPFrom     string
}

func LoadConfig() *Config {
	// Load .env file if it exists
	if err := godotenv.Load(); err != nil {
		log.Println("No .env file found, reading from environment variables")
	}
	  log.Println("DATABASE_URL =", getEnv("DATABASE_URL", "EMPTY"))

	redisDBStr := getEnv("REDIS_DB", "0")
	redisDB := 0
	if db, err := strconv.Atoi(redisDBStr); err == nil {
		redisDB = db
	}

	queueWorkerCountStr := getEnv("QUEUE_WORKER_COUNT", "5")
	queueWorkerCount, _ := strconv.Atoi(queueWorkerCountStr)

	rateLimitEnabledStr := getEnv("RATE_LIMIT_ENABLED", "true")
	rateLimitEnabled, _ := strconv.ParseBool(rateLimitEnabledStr)

	logAsyncStr := getEnv("LOG_ASYNC", "true")
	logAsync, _ := strconv.ParseBool(logAsyncStr)

	midtransProd, _ := strconv.ParseBool(getEnv("MIDTRANS_IS_PRODUCTION", "false"))

	return &Config{
		AppPort:                 getEnv("APP_PORT", "8080"),
		DatabaseURL:             getEnv("DATABASE_URL", "postgres://user:pass@localhost:5432/talentscale?sslmode=disable"),
		JWTSecret:               getEnv("JWT_SECRET", "super-secret-key"),
		FirebaseBucket:          getEnv("FIREBASE_BUCKET", "fir-novendra-portfolio.firebasestorage.app"),
		FirebaseCredentialsPath: getEnv("FIREBASE_CREDENTIALS", "fir-novendra-portfolio-firebase-adminsdk-fbsvc-623ca2d8e4.json"),
		RedisHost:               getEnv("REDIS_HOST", "localhost"),
		RedisPort:               getEnv("REDIS_PORT", "6379"),
		RedisPassword:           getEnv("REDIS_PASSWORD", ""),
		RedisDB:                 redisDB,
		QueueWorkerCount:        queueWorkerCount,
		RateLimitEnabled:        rateLimitEnabled,
		LogAsync:                logAsync,

		// Midtrans
		MidtransServerKey:    getEnv("MIDTRANS_SERVER_KEY", ""),
		MidtransClientKey:    getEnv("MIDTRANS_CLIENT_KEY", ""),
		MidtransIsProduction: midtransProd,

		// SMTP
		SMTPHost:     getEnv("SMTP_HOST", "smtp.gmail.com"),
		SMTPPort:     getEnv("SMTP_PORT", "587"),
		SMTPUsername: getEnv("SMTP_USERNAME", ""),
		SMTPPassword: getEnv("SMTP_PASSWORD", ""),
		SMTPFrom:     getEnv("SMTP_FROM", "noreply@talentscale.id"),
	}
}

func getEnv(key, defaultValue string) string {
	if value, exists := os.LookupEnv(key); exists {
		return value
	}
	return defaultValue
}
